[[プログラミング]] *Haskell [#qe34fb41] #contents ---- **Programming in Haskell [#jfaa53b7] -Graham Hutton著の「Programming in Haskell」や参考リンクのスライドに関するメモ。 --ちなみにオーム社から翻訳版として「Haskellプログラミング」というタイトルで出版されている。 ***第1章 導入 (Introduction) [#g4112448] - ***第2章 はじめの一歩 (First Steps) [#hc13dafd] - ***第3章 型とクラス (Types and classes) [#e28d8b9a] ***第4章 関数定義 (Defining functions) [#y4b4b199] ***第5章 リスト内包表記 (List comprehensions) [#rf740073] ***第6章 再帰関数 (Recursive functions) [#w0d93fa7] ***第7章 高階関数 (Higher-order functions) [#o0ebd248] ***第8章 関数型パーサー (Functional parsers) [#y6012088] ***第9章 対話プログラム (Interactive programs) [#pf099b05] ***第10章 型とクラスの定義 (Declaring types and classes) [#o7aa1d34] ***第11章 切符番号遊び (The countdown problem) [#o956c676] ***第12章 遅延評価 (Lazy evaluation) [#gd52ef8a] ***第13章 プログラムの論証 (Reasoning about programs) [#bb50e0f7] **ふつうのHaskellプログラミング [#s1d34753] -青木峰郎著の「ふつうのHaskellプログラミング」に関するメモ。 ***第1章 [#ia9acaad] -高階関数 --引数や戻り値として関数を取る関数。 -多相型(polymorphic type) --Javaでいう総称型(generic type)、C++とかではtemplate -遅延評価 --式を評価する方式の一つ。最初に数値(引数)の評価では無く、関数の評価を行う。Haskellは遅延評価を基本としている。 ***第2章 [#c05a3326] -mainアクション --Haskellでは実行するとmainアクションの評価が始まる。 -関数の適用 --以下におなじみの"Hello, World!"のHaskellでの例を示す。Haskellでは、"Hello, World!"に関数putStrLnを適用する(apply)と言い、そのアクションを評価することにより、Hello, Worldが表示される。 main = putStrLn "Hello, World!" --ちなみに""中にエスケープシーケンスも代入可能。 -レイアウト --do文等に記述される後続の複数のアクションは同一のインデントでなければならない。 --Javaでいうブロック構文 --別名、オフサイドルール(off-side rule)と言う。 -$演算子 --関数の戻り値を新たに関数の引数として利用するなど、複数の関数を連続して書きたい場合、従来の言語では括弧のネストが見づらかったが、$演算子を用いることにより、スマートに記述が可能。 f (g ( h "Hello, World!")) f $ g $ h "Hello, World!" -lines及びunlines関数 --lines :: String -> [String]~ 改行区切りの文字列をStringのリストにする。 --unlines :: [String] -> String~ Stringのリストを改行区切りの文字列にする。 ***第3章 [#n0816b65] -型推論 --言語処理系がその型を前後の文脈などによって自動的に推論する仕組み -型変数 --例としてlength関数の型は以下のとおりである。 [a] -> Int --aに限らず、アルファベットの小文字から始まる変数を、型変数という。ちなみに多相型は型変数を含む型のことである。 --関数が以下のような型の場合、同じである可能性もあるが、aとbは同じでなくても良い。 [a] -> [b] -if式 --Haskellでは三項演算子のように、if全体が値を持つ。なのでif式。 if 条件式 then 式1 else 式2 --とか if 条件式 then 式1 else 式2 --等。 ***第4章 [#p94200e1] -コマンドライン引数取得 --Haskellでコマンドライン引数を取得するには、SystemモジュールのgetArgsアクションを用いる。 --以下はechoコマンドの一例 import System main = do args <- getArgs putStrLn $ unwords args --unwords :: [String]->String~ ["a","b","c"]を"a b c"のように、空白区切りにする関数。 -Mainモジュール --どの変数も、何らかのモジュールに所属している。Haskellではファイルに明示的にモジュールを宣言しない場合、main変数だけが公開されている、Mainモジュールとなる。 -Preludeモジュール --getContentsや、リストの操作関数は全てPreludeモジュール内で定義されている。原則、暗黙にインポートされる。 -where節 --式で一時的に使用する変数(関数)の定義に用いる。whereの中で定義した変数はwhere節を記述した関数以外からは参照不可。whereの中からは外側の変数を参照可能。 式 where 定義1 定義2 --や 式 where 定義1 定義2 --等。 -filter関数 --filter :: (a -> Bool) -> [a] -> [a]~ 型がa -> Boolである関数を、リスト[a]の各要素に適用し、Trueである要素のみを取り出す関数。 -any関数 --any :: (a -> Bool) -> [a] -> Bool~ 型がa -> Boolである関数を、リスト[a]の各要素に適用し、いずれかの値がTrueならば、Trueを返す関数。 **環境設定 [#lfb9b429] ***Haskell mode (emacs) [#u31ea315] -Hasklellプログラミングをemacsでする為に、Haskell modeが存在する。 -以下のリンクから最新版のアーカイブをダウンロードし、適当な場所に解凍する(e.g. ~/share/emacs/site-lisp/haskell-mode-*.*.*/) --http://projects.haskell.org/haskellmode-emacs/ -~/.emacsに以下の記述を追加する。 ;; haskell (load "~/share/emacs/site-lisp/haskell-mode-*.*.*/haskell-site-file") (setq haskell-program-name "/usr/bin/ghci") --標準ではインタプリタとしてHugs 98が指定されているので、ghciを使用したいときにhaskell-program-nameを指定する。 -サブウィンドウでインタプリタを起動する M-x run-haskell -編集しているプログラムをインタプリタでロードする C-c C-l **参考リンク [#v1460dec] --http://www.cs.nott.ac.uk/~gmh/book.html