Over the years I’ve been gradually chipping away at the problem of graph hashing. For those who are unfamiliar with graph hashing, here is the basic problem: how do you extend hashing algorithms so that they can operate over directed graphs and not just over strings or trees. This problem has proved to be substantially deep. Hashing trees is very simple: simply recursively hash children nodes in…
My first commercially successful foray into the world of computer programming came with my contributions to a project called pyspades, an open source server for the game Ace of Spades. For those who are not familiar, Ace of Spades came out shortly after Minecraft made it big, and unlike Minecraft which was focused on sandbox exploration, Ace of Spades was a free multiplayer voxel (blocky) first…
As a functional programming language, Juniper supports the primary feature of any functional language - first class functions. Since Juniper targets Arduino compatible systems that have minimal amounts of RAM, we would like to avoid heap allocations. Indeed, if you look at recommendation guides for embedded system programming, you will find that heap allocation shouldn’t be used or minimized. This…
Large language models are already disrupting many areas of written work such as education, news stories and book publishing. The implications for education are obvious - students can cheat on essay writing by simply offloading all the hard work to the computer. Classical plagiarism checking tools are useless, and textual style of writing can be changed with a little prompt engineering. The story…
Here is my version of “yet another monad tutorial”. In this tutorial I will not cover specific examples of Monad implementations in detail since I think that this distracts from the goal of understanding the overall abstraction. I will also not cover some of the simpler type classes such as Functor and Monoid in detail, since these aren’t really that important for understanding Monad.
Interprocess communication has been around for quite some time, but nobody seems to use it outside of simple command line programs. Instead, software exists in a walled ecosystem, where programs are unable to communicate except for copy/paste and saving files. MaestroFlow is a program that aims to solve these issues. MaestroFlow consists of a centralized server with a GUI display, and programs…
Logical functions are critical parts of almost every computer program. However, optimization problems are often solved over the set of real numbers, which does not fit nicely into this rigid binary logic. In many cases, we’d like to take advantage of applying logical operations, which includes their use in things like deep neural networks. How to describe these discrete functions in terms of a…
Type inference is used in functional programming languages to automatically deduce the type of expressions based on how the expression is used. Inference reduces the burden on the programmer who would otherwise have to write all the types manually. Anyone who uses an imperative statically typed programming language knows how quickly explicit type annotations can become burdensome. Type inference…