Arcadian Visions Blog
I should coco
The vinyl package offers a take on extensible records for Haskell with an emphasis on using lenses for manipulation. A representative use of their strengths is the relative ease with which one can work on a subset of fields of a large record. However, their implementation as a heterogeneously-typed list means that accessing a field takes an amount of time proportional to the field's position in the record. For small records, this is not significant, but we now offer a mechanism to package a record up in a value whose API is identical to that of classic
vinyl but offers constant-time field access.
cquery is a language server for C, C++, and Objective-C built on libclang. I use it in emacs with the help of lsp-mode and lsp-ui. The wrinkle is that I define my development environments using nix. This article shows a sample project using these things along with some work-in-progress glue I've written.
Running source files through a C preprocessor (CPP) is a common step for many languages. In part it leverages common familiarity with C, in part it can ease eventual interoperation with C, and – the part that I think is interesting – it occasionally feels like a reasonable trade-off between power and complexity. So what use is
hpp, a Haskell preprocessor?
Updates, bug fixes, performance improvements, and stability. How can we meaningfully identify software dependencies?
Allowing programmers to express themselves through their choices about notation layout – the fiddly details of how a program represented as a string of characters is laid out in a text file – provides flexibility for different preferences and computer screen situations at the expense of mutual readability between different people.
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">Haskell programming techniques were set back by mtl being associated with monad transformers.</p>— Anthony Cowley (@acowley) <a href="https://twitter.com/a_cowley/status/753679659443838976">July 14, 2016</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr"><a href="https://twitter.com/a_cowley">@acowley</a> <a href="https://twitter.com/rufuse">@rufuse</a> Could I ask why it's so important? If you write up a short explanation, I'll change my slides.</p>— Domen Kožar (@iElectric) <a href="https://twitter.com/iElectric/status/754689121491292160">July 17, 2016</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
Some time ago, I made the traditional bad decision of working on my own build tool. In this case, I was interested in more efficiently sharing compilation artifacts across a dozen or so Haskell projects between two development machines without sacrificing isolation between those projects such that working on one would never break another.
The debate around granting the government access to encrypted communications reached a new level when the Department of Justice demanded Apple help them break the encryption of an iPhone connected to a terrorist.
This article is for those familiar with Haskell and, at least passingly, with Jon Sterling's
vinyl library (that packs quite a nice introduction). Further, it is assumed that the reader is familiar with the basics of computer graphics and OpenGL. I have written another article that introduces the use of relatively modern OpenGL practice with Haskell that may serve as a primer for this article.
OpenCL is a cross-platform parallel programming standard with support for execution on both CPUs and GPUs. The OpenCL package on hackage provides a direct binding to the API with just enough Haskellosity to make invoking those API functions borderline pleasant. That said, there remains a certain amount of boilerplate that is rather offputting.
Some time ago I forked Noam Lewis's HOpenCV bindings to the fine OpenCV library to fill them out with pieces I needed for several projects at work, and to experiment with how such bindings could be used. Over time I've built up some useful components, and, in a fit of non-procrastination, I've recently pushed many updates and assembled a fun demo program.
A post on reddit linked to several implementations of a cute "Hello, world!" program demonstrating a genetic algorithm that evolves towards a target string. Example programs were written in several languages, and I thought a Haskell version could be worthwhile as it demonstrates the use of random numbers, an issue that frustrates many newcomers to the language.