【ハスケル】

Haskell(ハスケル) とは?

最終更新:
💡 純粋な計算と入出力を、型で区別する言語

純粋関数型のプログラミング言語。静的な型、型推論、遅延評価、IOによる入出力の区別が特徴です。副作用やエラーがすべてなくなるという意味ではありません。

📌 このページのポイント
Haskell:純粋な計算と入出力を区別純粋な計算double x = x * 23× 26入出力のアクションmain :: IO ()putStrLn "Hello"Hello遅延評価:必要な部分から計算take 3 [1..] → [1,2,3]IOも使える。型で計算と入出力を区別正しさ・終了・省メモリーの保証ではない
別々の言語機能の例です。遅延評価では無限リストの先頭三つだけを求められますが、すべてのプログラムの終了や少ないメモリー使用を保証するものではありません。
ひよこ ひよこ
Haskellは、何が特徴の言語?
ペンギン先生 ペンギン先生
純粋関数型の言語だよ。値を勝手に書き換えるのではなく、関数を組み合わせて計算を表す。同じ純粋な式をその値に置き換えても意味が変わらない、という参照透過性が考え方の土台になるんだ。
ひよこ ひよこ
画面表示や、ファイル保存はできない?
ペンギン先生 ペンギン先生
できるよ。純粋な計算と、外の世界に作用する入出力を区別するんだ。たとえば、数を計算する関数と、画面へ文字を出すIOアクションは、型で違いが分かる。「副作用があるプログラムを作れない」という意味ではないよ。
ひよこ ひよこ
型推論なら、間違いは全部防げる?
ペンギン先生 ペンギン先生
型を書かなくても、処理から型を推論できる場合がある。型に合わない値の組み合わせ等は見つけられるけれど、意図と違う計算や、実行中の失敗まで全部防ぐわけではない。読みやすさのために型を明示することもあるんだ。
ひよこ ひよこ
遅延評価は、どういうこと?
ペンギン先生 ペンギン先生
必要になるまで計算を進めない考え方だよ。たとえば、1から続く数のリストから先頭三つだけ取り出すなら、使う部分を求められる。無限に続くリストを全部計算してから取り出す必要はないんだ。
ひよこ ひよこ
遅延評価なら、メモリーも少なくて済む?
ペンギン先生 ペンギン先生
不要な計算を避けられる場合はあるけれど、未計算の処理や大きなデータを保持して、メモリーを多く使う場合もあるよ。GHCの公式資料でも、メモリーの保持による問題の調査を説明している。速さや使用量は、実際のプログラムで確認するんだ。
もっと詳しく知りたい人へ

IOとモナドは、同じ意味?

IOは入出力のアクションを区別する型です。モナドは処理を組み合わせる構造で、IO以外にも使います。モナドと書いてあれば、すべて外部への副作用があるという意味ではありません。

純粋な関数なら、必ず答えが返る?

無限に計算が続く式や、評価した時にエラーになる式もあります。純粋であることは、どんな入力でも終了して正常な値を返すことの保証ではありません。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「Haskell」って出てきたら「純粋な計算と入出力を区別し、型を活かして書く関数型の言語」と思えばだいたいOK!
📖 おまけ:英語の意味
「Haskell」 = 論理学者Haskell B. Curryにちなむ名前
💬 Haskell 2010 Reportの序文で、Haskell B. Curryにちなんだ名前と説明されています。

参考資料

← 用語集にもどる