IT用語辞典バイナリ |
Haskell
Haskellとは、遅延評価など多くの先進的な概念を取り込んだ純粋な関数型プログラミング言語である。
Haskellの言語仕様は1987年に作られた。言語の名称は記号論理学者Haskell Brooks Curryの名にちなんでいる。プログラミング言語としては、現在産業用に用いられているC++、Java等の他の言語とはかなり異なった性格を持っており、直接の原型となったMirandaや同様の関数型言語であるMLなどに近い部類に属する。
Haskellの大きな特徴として、遅延評価を挙げることができる。遅延評価とは、具体的な値が必要になった時点で計算を実行するというものである。また純粋な関数型言語であるため、副作用の無い関数合成が可能である。この点は、代入などの副作用を伴うC言語などの一般的なプログラミング言語とは異なっている。その他の顕著な特徴として、高階関数、静的多相型付け、パターン照合、リストの内包表記、豊富なデータ型(リスト、配列、任意倍長整数など)の提供、などが挙げられる。
Haskellは現在、主にソフトウェア研究の場で利用されている。これまでソフトウェアコンテストなどで、プログラミング言語としての高い能力を証明してきた。典型的には、抽象度が要求される数学的な問題に対するプログラミングにおいて高い生産性を持つとされる。また複雑で大規模になりがちなシステムを、その高い抽象能力によって簡潔に記述できる、とされている。しかし反面、標準Haskellレベルでは、現実の利用シーンで弱いケースもある。例えばIO処理については、IOモナドという機構により入出力機能の補完が必要になる。
参照リンク
本物のプログラマはHaskellを使う - (日経BP ITpro)
HaskellWiki - (英文)
ウィキペディア |
Haskell
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2011/11/01 04:50 UTC 版)
Haskell(ハスケル)は非正格な評価を特徴とする純粋関数型プログラミング言語である。名称は論理学者であるハスケル・カリー (Haskell B. Curry)に由来する。
- ^ かつては Goffin と呼ばれていた。
- ^ 「変数」は実際にはその値を動的に変更することはできないなど、C言語など手続き型言語の変数とは明らかに異なるものである。値を変更することはできなくても、言語仕様においてもこれは "variable" と呼ばれている。
- ^ ここでは説明のため単に Float としているが、標準ライブラリで定義されている円周率 pi は浮動小数点数型の抽象的な型クラスである Floating a で定義されており、Float のみならず 倍精度浮動小数点数型 Double の値としても取得できる。
- ^ Haskell はカリー化によりすべての関数を 1 引数の関数として表現できるが、これにしたがって -> は右結合であるとして読むこともできる。上記の関数の型の定義は、括弧を明示した次の定義と同等である。
gcd :: Int -> (Int -> Int)
関数を引数にとる関数は、引数の型を括弧で囲んで -> 記号の優先順位を指定すればよい。次は関数を二つとり、その合成関数を返す演算子 . の定義である。
(.) :: (b -> c) -> (a -> b) -> a -> c
- ^ 式の外で演算子の型を指定するときは、演算子を括弧で囲めばよい。以下の関数と演算子の相互変換を参照のこと。
- ^ これは、C++ や Java のような言語では次のようなコードに相当する。
Hashtable<String,Int> hashtable;
- ^ 当然ながら、リストの要素としてリストを持つこともできる。例えば、複数の文字列からなる文の型は [[Char]] となるであろう。
- ^ ユニットはC言語やJavaなどでいう void のような使われ方をする。
- ^ 言い換えれば、単純な型名に見えても何か複雑な別の型の別名である可能性がある。
- ^ 実際に標準ライブラリでは String は [Char] の別名であり、String にはあらゆるリストの操作が可能である。
- ^ 除算する演算子 / は存在するが、これは Float などを除算する演算子であり整数ではない。他の言語のように自動的に値を変換する( int → float など)ような動作は Haskell では意図的に排除されている。
- ^ ただし、正格評価のほうが効率がいい場合もあり、必要に応じて正格評価もできる。
- ^ Haskellの型システムにおける汎用型が実体化されたもの。オブジェクト指向におけるインスタンスとは異なる。
- ^ ただし、型を明示することは可読性を向上したり問題の発見に役立つため、常に省略するのがよいとは限らない。なお、次のコードは型宣言が必要な例である。read は文字列をその文字列があらわすデータ型に変換する抽象化された関数である。
main = print (read "42") -- コンパイルエラー!
このコードはコンパイルエラーになる。read は複数のインスタンスで実装されており、数値なら数値型に変換する read 、リストならリストに変換する read というように型ごとに実装が存在する。Haskell の型は総て静的に決定されなければならない。このコード場合、プログラマは
read :: String -> Int
という型をもつ実装の read が選択されると期待しているであろうが、これはコンパイラによる静的な型検査では決定できない。つまり、Haskell コンパイラは read の返り値を受け取っている関数 print の型を検査し多数の実装の中から適切な read を選択しようとするが、print は Show のインスタンスが存在するあらゆる型を引数にとるため、型推論によっても read の型を一意に決定できない。これを解消するひとつの方法は、:: によって型を明示することである。
main = print ((read "42") :: Int) -- コンパイル成功!read の返り値を Int と明示している
また、そもそも read の返り値を整数型しか取らない関数に与えていればあいまいさは生じず、型推論は成功する。
printIntOnly :: Int -> IO () printIntOnly x = print x main = printIntOnly (read "42") -- コンパイル成功!
他の言語、たとえば Java でこのような抽象的な関数を書こうとしても、Java では返り値の値の型によって関数を選択するようなことはできない(引数の型によって選択するメソッドのオーバーロードは存在する)。そのため、関数の実装ごとに別の名前をつけてプログラマに明示的に選択させて解決させることになる( java.lang.Integer.parseInt()、java.lang.Double.parseDouble() など)。この方法は簡潔でわかりやすいが、抽象性の高さに基づく再利用性という点では Haskell のような多相には劣ってしまう。
- ^ データ型名とデータコンストラクタ名は同じでも構わない。このような単純な代数的データ型であれば型名とデータコンストラクタ名を同じにすることも多い。
- ^ GHC には System.IO.Unsafe モジュールに unsafePerformIO という関数があり、副作用を持ちながらアクションでない型を返すことができる。これは参照透過性に対するバックドアであり、Haskell の参照透過性を破壊する恐れがあるので、注意深く使わなければならない。
- ^ a b c “Preface”. Haskell 98 Language and Libraries: The Revised Report (2002年12月). 2009年6月23日閲覧。
- ^ “The History of Haskell”. 2009年6月23日閲覧。
- ^ Simon Peyton Jones (editor) (2002年12月). “Haskell 98 Language and Libraries: The Revised Report”. 2009年6月23日閲覧。
- ^ “Future development of Haskell”. 2009年6月23日閲覧。
- ^ “Welcome to Haskell'”. The Haskell' Wiki. 2009年6月23日閲覧。
固有名詞の分類
Haskellに関連した本
- プログラミングHaskell Graham Hutton オーム社
- ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門 青木 峰郎 ソフトバンククリエイティブ
- Real World Haskell―実戦で学ぶ関数型言語プログラミング Don Stewart オライリージャパン
Haskellに関係した商品
- 【送料無料】プログラミングHaskell楽天ブックス
- ミリアムハスケル,Miriam Haskellニューヨークのアンティークストアにて買い付けましたお品物でございます。14%OFF! ミリアムハスケル/Miriam Haskellブレスレットバロックパール&シュミレーテッドパール ゴールドメタルセーフティーチェーン付き【送料無料】 【代引き手数料無料】茅ヶ崎さくらアンティークス
- 【送料無料】Bergin and Haskell's Preface to Estates in Land and Future Interests, 2D (University Textbook Series楽天ブックス