RSSAmplifier

Blog

3545100301

Some random Haskell and C++ (mostly)

0xd34df00d.meRSS feed ↗10 posts

Latest posts

What's up with cross-module optimizations?

Last time , we implemented a simple regexp engine and looked at how it could be optimized. Truth is, I cheated a little: all the code, from the regexp definition to calling the regexp engine, was in the same module. However, it’s unlikely you’d write your production code like this. You’d probably separate different functionality into different modules: low-level memory representation-related…

Let's run some NFAs

Lately, I’ve been playing around with memoized NFAs for optimized regular expression matching, with features like lookahead and atomic groups, based on this paper . The original authors have their code in Scala, and I thought it’d be fun to code something in Haskell to see how it stacks up against their new implementation and the prior art. But before diving into memoization and the more complex…

Nubbing lists in C++

It’s been a while since I last used C++ for anything serious, but once a C++ guy, you’re always a C++ guy, right? So, I decided to see how modern C++ fares in a seemingly simple task: eliminating duplicate list elements. That sounds trivial, so why bother with a whole blog post? Well, the catch is we’re gonna do this at compile-time. Moreover, lists will be represented as tuples, and the elements…

Haskell is quite OK for images: encoding QOI

Last time we’ve looked at writing a decoder for the QOI format . Today, we’ll look at the inverse: encoding QOI images and all that it entails. Like the last time, this post describes both the final result and the road there. So, there will be lots of code and lots of diffs, beware!

Haskell is quite OK for images: decoding QOI

I’ve recently come across the new “Quite OK Image” format — a fast lossless image compression algorithm. It’s a very straightforward algorithm that’s a pleasure to work with, so, naturally, I got curious what would be the performance of a Haskell implementation if: I just write reasonably efficient code without getting too deep into low-level details to get the job done in a couple of hours. I try…

(neo)vim and Haskell, 2021 edition

In this post, I’ll describe my setup for doing Haskell (which I almost exclusively do with stack -based projects). Spoiler: it’s much, much more straightforward than a few years ago, almost to the point of “vim and Haskell” posts being no longer necessary.

Grokking recursion

If we want to use dependently typed languages as proof checkers, we better be sure they are consistent as a logic, so that we don’t accidentally prove ⊥ and, as a consequence, any proposition. One huge source of inconsistency is non-terminating computations; hence languages like Idris or Agda go to great lengths to ensure that functions indeed do terminate. But, for deep reasons , a purely…

Call stacks aren't really call stacks

Haskell is a very special language, and one of the peculiarities setting it aside is its evaluation model. In fact, the thing I, for one, find most complicated about Haskell is not monads nor all the countless type system extensions, but rather reasoning about space and time complexity of whatever I write. Thus I better have a good mental model about how Haskell code gets to run, and one of the…

The joys and perils of beating C with Haskell: productionizing wc

Last time we’ve looked at implementing a toy wc -like program and we’ve also compared its performance against the full-blown Unix wc . The results were quite interesting: our implementation managed to beat wc by a factor of 5. Of course, that’s quite an unfair comparison: our implementation is hardcoded to count just the bytes, lines and words. wc , on the other hand, has command-line options to…

Further beating C with 20 lines of Haskell: wc

tl;dr: today we’ll look at implementing a toy wc command that is about 4-5 times faster than the corresponding GNU Coreutils implementation. So I’ve recently come across a post by Chris Penner describing a Haskell implementation of the Unix wc command. Chris did a great job optimizing the Haskell version as well as showing how some high-level primitives (monoids and streaming, for one) turn out to…