20151121
TRANSCRIPT
Haskellハンズオン
● 資料: オーム社『プログラミングHaskell』
記号表
Haskellについて● Haskell自体には特にCSPとのかかわりはない● 並列・並行フレームワークは近年さかんに開発
されている / DSLのツールとしても有用● Software Transactional Memory (STM) が有力
● 標準でIOなどの副作用が閉込められているため● Communicating Haskell Processes (CHP)
● CSPベースの並行フレームワーク● 『Haskellによる並列・並行プログラミング』● モナド: 言語(コア)マターではなくライブラリ
(構文糖などはあるが)
遅延評価Prelude> let lst = [x*x | x <- [1..10]] :: [Int]Prelude> :sp lstlst = _Prelude> take 3 lst[1,4,9]Prelude> :sp lstlst = 1 : 4 : 9 : _Prelude> length lst10Prelude> :sp lstlst = [1,4,9,_,_,_,_,_,_,_]
「魔法ではない」● Haskell自体には、Prologのようなパターンマッ
チ&バックトラックはありません● パターンマッチは関数適用の1方向のみ
⬐できません● predicate x x のようにして「2個の実引数が同じ」
● (たとえば)整数引数の関数が自動でメモ化されるわけでもありません● 例: ナイーブな fib はやはりとても遅い
● それなりに効率的なコードはそれなりに難しい → 最後に
第2章● https://www.haskell.org/hoogle/● p. 15 : ghci では let one = 1 のように、
1行なら定義ができる● p. 16 : コロンで始まるコマンドは、
そこにあるものは ghci でも共通● 名前(識別子)は種類ごとに
● 先頭が小文字の名前● 先頭が大文字の名前● (先頭がコロン以外の演算子)● (先頭がコロンの演算子)
第2章 (cont)● 優先順位: 関数適用は高く、演算子は低い● $ 演算子は優先順位最低の右結合演算子
● a b (c d) → a b $ c d
● ' は先頭にあると Char のリテラル、それ以外は名前の一部として使える(「ちょっとした違い」の意味で多用)
● -- から行末まではコメント
第3章● 「:t」コマンドで型の情報を表示● 「:i」コマンドでその名前に関する情報
● ごちゃごちゃ出てくるのですぐには慣れないかも● 型推論: 簡単な式なら任せっきりで良い● -Wall を付けていると、トップレベルの定義に
「 :: 型」が無い場合は警告● 最初からある (Prelude の) 名前を変えるのは、
my--- とか付けて避けてください● Fractional と Data.Ratio.% , toRational
第4章● Pythonは「TOOWTDI」だが、Haskellはそうで
はない(必ずしもTMTOWTDIでもないが)● 多値関数はタプルとタプルパターンで● n+kパターンはobsoleted● (既に出ているが)「セクション」の反対は
バッククオート(例) 10 `div` 3
● (慣れてきたら) declaration styleで● https://wiki.haskell.org/Declaration_vs._expression_style
第5章● リスト内包表記 (list comprehension、包含)● 「 <- 」(本文中では ← ) は、集合の
記法の ∈ の気分、「外延と内包」の内包● (最近のPythonにも似たものがある)● やはり魔法ではない● [(x,y) | x <- [0..], y <- [0,1,2]] --これはOK● [(x,y) | x <- [0,1,2], y <- [0..]] -- これはダメ
(これはMirandaでは // という記号を使うdiagonalisingというものでできる)
第6章、第7章● 再帰と高階関数● 『Lisp(Scheme)手習い』● 最初は再帰で、慣れたら高階関数へ● 効率?
● そのうちどうしても実際に問題が出たら● 遅延評価のせいで 1+2+3+...+10000 を計算しないま
ま持つようになっているかもしれない● だけどそれを逆にしようとした結果、必要のない計
算までするようにしてしまうかもしれない
続き● 効率? (続き)
● これまでのプログラミングの直感と違う● ほんとに大変なら、詳しい人に助言を仰ぐ● 以前は foldl は要注意でしたが、最近は大丈夫● http://www.well-typed.com/blog/2014/04/fixing-foldl/● というわけで、だいたい大丈夫ではある● でも、ビッグデータもどきぐらいでも問題出るかも● オライリー『Real World Haskell』第25章● この資料の次のページ (のリンク先) も参照
その他のまとめ● Haskellらしい、かつちゃんとチューニングされた
● フィボナッチ● 素数● クイック(等)ソート
● http://d.hatena.ne.jp/kazu-yamamoto/20100624/1277348961を参照
● 参:手続き言語で同様にチューニングされたQソート● 岩波講座 ソフトウェア科学 3
『アルゴリズムとデータ構造』● マージソート?● http://ksmakoto.hatenadiary.com/entry/2014/05/23/195724