Haskellのseqについて

Haskellの計算は遅延評価なので,気軽にループを書くとスペースリークに悩まされることがある. 人はseqを使えというが, 初心者からするとその挙動が結構トリッキーで何度も苦しめられた. ので,整理してみる. 小手調べ まずは評価戦略の整理から.:sprin…

HaskellでProject Euler #51

List comprehensioが便利だった.ideoneで<0.3secぐらい. import Data.List -- PE #51 main :: IO () main = do let n = 8 -- Suffice to check (11 - n) digits for n primes families let chars = take (11 - n) "0123456789" let primes = 2 : filter is…

HaskellでProject Euler #11

tailsの使い方の勉強になったのでメモ. tailsが特別便利と言うよりは,Haskellにはfor文とかwhile文などの繰り返し構文がないので,そもそもiterate系全般がありがたいっぽい. 他にData.List特有のiterate系関数としては,subsequences, permutations, nub…

理想のプログラミング言語と副作用

副作用 最近思うに,プログラミングの「副作用」という用語は結構ミスリーディングだ. 確かに副作用を持つコードはバグの温床になりやすいと言うしその実感もあるけど,じゃあ副作用なんてやめて全部主作用にしよう,全部引数と戻り値に書いちゃおう,とは…

Haskellの繰り返し制御

Haskellでは手続き型言語の繰り返しに相当する制御構文がないかわりに、fold系が強力な道具となる1。 実際、簡単なfor文に相当するものはfoldで書けてしまう。例えば2、 import Control.Monad import Control.Monad.ST import Data.List import Data.STRef -…

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の歩みを書き留めておく。