20151121

13

Click here to load reader

Upload: makoto-kishimoto

Post on 12-Apr-2017

353 views

Category:

Software


0 download

TRANSCRIPT

Page 1: 20151121

Haskellハンズオン

● 資料: オーム社『プログラミングHaskell』

Page 2: 20151121

記号表

Page 3: 20151121

Haskellについて● Haskell自体には特にCSPとのかかわりはない● 並列・並行フレームワークは近年さかんに開発

されている / DSLのツールとしても有用● Software Transactional Memory (STM) が有力

● 標準でIOなどの副作用が閉込められているため● Communicating Haskell Processes (CHP)

● CSPベースの並行フレームワーク● 『Haskellによる並列・並行プログラミング』● モナド: 言語(コア)マターではなくライブラリ

(構文糖などはあるが)

Page 4: 20151121

遅延評価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,_,_,_,_,_,_,_]

Page 5: 20151121

「魔法ではない」● Haskell自体には、Prologのようなパターンマッ

チ&バックトラックはありません● パターンマッチは関数適用の1方向のみ

               ⬐できません● predicate x x のようにして「2個の実引数が同じ」

● (たとえば)整数引数の関数が自動でメモ化されるわけでもありません● 例: ナイーブな fib はやはりとても遅い

● それなりに効率的なコードはそれなりに難しい → 最後に

Page 6: 20151121

第2章● https://www.haskell.org/hoogle/● p. 15 : ghci では let one = 1 のように、

1行なら定義ができる● p. 16 : コロンで始まるコマンドは、

そこにあるものは ghci でも共通● 名前(識別子)は種類ごとに

● 先頭が小文字の名前● 先頭が大文字の名前● (先頭がコロン以外の演算子)● (先頭がコロンの演算子)

Page 7: 20151121

第2章 (cont)● 優先順位: 関数適用は高く、演算子は低い● $ 演算子は優先順位最低の右結合演算子

● a b (c d) → a b $ c d

● ' は先頭にあると Char のリテラル、それ以外は名前の一部として使える(「ちょっとした違い」の意味で多用)

● -- から行末まではコメント

Page 8: 20151121

第3章● 「:t」コマンドで型の情報を表示● 「:i」コマンドでその名前に関する情報

● ごちゃごちゃ出てくるのですぐには慣れないかも● 型推論: 簡単な式なら任せっきりで良い● -Wall を付けていると、トップレベルの定義に

「 :: 型」が無い場合は警告● 最初からある (Prelude の) 名前を変えるのは、

my--- とか付けて避けてください● Fractional と Data.Ratio.% , toRational

Page 9: 20151121

第4章● Pythonは「TOOWTDI」だが、Haskellはそうで

はない(必ずしもTMTOWTDIでもないが)● 多値関数はタプルとタプルパターンで● n+kパターンはobsoleted● (既に出ているが)「セクション」の反対は

バッククオート(例) 10 `div` 3

● (慣れてきたら) declaration styleで● https://wiki.haskell.org/Declaration_vs._expression_style

Page 10: 20151121

第5章● リスト内包表記 (list comprehension、包含)● 「 <- 」(本文中では ← ) は、集合の

記法の ∈ の気分、「外延と内包」の内包● (最近のPythonにも似たものがある)● やはり魔法ではない● [(x,y) | x <- [0..], y <- [0,1,2]] --これはOK● [(x,y) | x <- [0,1,2], y <- [0..]] -- これはダメ

(これはMirandaでは // という記号を使うdiagonalisingというものでできる)

Page 11: 20151121

第6章、第7章● 再帰と高階関数● 『Lisp(Scheme)手習い』● 最初は再帰で、慣れたら高階関数へ● 効率?

● そのうちどうしても実際に問題が出たら● 遅延評価のせいで 1+2+3+...+10000 を計算しないま

ま持つようになっているかもしれない● だけどそれを逆にしようとした結果、必要のない計

算までするようにしてしまうかもしれない

Page 12: 20151121

続き● 効率? (続き)

● これまでのプログラミングの直感と違う● ほんとに大変なら、詳しい人に助言を仰ぐ● 以前は foldl は要注意でしたが、最近は大丈夫● http://www.well-typed.com/blog/2014/04/fixing-foldl/● というわけで、だいたい大丈夫ではある● でも、ビッグデータもどきぐらいでも問題出るかも● オライリー『Real World Haskell』第25章● この資料の次のページ (のリンク先) も参照

Page 13: 20151121

その他のまとめ● Haskellらしい、かつちゃんとチューニングされた

● フィボナッチ● 素数● クイック(等)ソート

● http://d.hatena.ne.jp/kazu-yamamoto/20100624/1277348961を参照

● 参:手続き言語で同様にチューニングされたQソート● 岩波講座 ソフトウェア科学 3

『アルゴリズムとデータ構造』● マージソート?● http://ksmakoto.hatenadiary.com/entry/2014/05/23/195724