So, I just found out about this cool Scala library, Shapeless.
It contains (among many things) what the author describes as “the mother of all
HList implementations.” If you’ll remember, I did a post on using
HLists to kinda-sorta simulate variable-arity polymorphism, as a followup to my very frist psot using Typed Racket’s variable-arity features to make a “
fmap*” function that “lifts” functions of arbitrary arity into functions over functorized values – in that case, the functor was the type of probability distributions.
Shapeless has the ability to convert from functions of arbitrary arity to functions which accept a single
HList parameter. Using that, he’s defined a variadic lifting function,
lift0, which takes a function
(A, B, C, ...) => D and turns it into
(Option[A], Option[B], Option[C], ...) => Option[D]. This is exactly my holy-grail “
fmap*” for the Option functor, and it’s done perfectly!
In Typed Racket I had to (mostly) disable type checking to use
fmap* without requiring a frightening amount of type annotations, which made it more of a moral victory than something practical. In my Scala attempts at
HLists, I acknowledged the connection, but certainly didn’t get anywhere close to an ability to convert between regular functions and functions over
HLists, nor did I know it was possible.
Anyhow, I just think it’s very cool that somebody solved this puzzle 1) which I didn’t know how to solve, 2) for which I doubted a solution was possible, and 3) packaged it all up into a nicely reusable library that borders on the practical. This puts Miles Sabin up there with Oleg for smashing apart my preconceptions of what is and isn’t possible in the static type systems of actually usable languages.
I recommend you check out the library. It’s mostly above my head, which is always a good sign. Next step is to use recursive types to develop a similar facility for curried functions…