pythonでcurryワンライナー

pythonを書いていて、急にcurry化したくなったときはこうする: import functools curry = lambda n: lambda f: lambda x: (curry(n - 1)(functools.partial(f, x)) if n > 1 else f(x)) そんでもってこう: @curry(3) def func(x, y, z): return x + y * z …

Injective Functional Dependency

マルチパラメタクラスの型変数間に一対一の対応関係をもたせたいとする。 このとき、型変数の間に相互にfuncitonal dependency をもたせればよい。 {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE FunctionalDependencies #-} -- | this typechecks c…

Haskellの太いほうの矢印について

Haskellには頻出する矢印が2つある(->と=>)。 なかでも=>(型制約導入子?)がくせものである。 くせものポイント1:数学の「ならば」とは(一見)違う意味を持つ。 くせものポイント2:もちろん日本語の「ならば」とも違う意味を持つ。 くせものポイン…

Nixパッケージマネージャとproot

背景 Nixはバージョン管理に強いパッケージマネージャーのひとつ。同じライブラリの異なるバージョンを共存させたり、環境設定を巻き戻したりすることが得意。 今回は「Nixを使いたいがrootがないので/nixを作成できない」場合に対処する方法についてまとめ…

型レベルリテラルと行列

行列(matrix)同士の和・差・積は、 行列の形によっては定義されない。せっかくHaskellのように強い型システムをもつ言語を採用していても、実行時エラーの潜在的原因になってしまう。 これをコンパイル時に防ぐには、行列の形まで含めて静的に型付けする。 …

Haskell学習記(1)

少し前にHaskellの勉強を始めて軌道に乗りだしたので、初志を忘れないように、ポストLYHGGの歩みを書き留めておく。