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 lst
lst = _
Prelude> take 3 lst
[1,4,9]
Prelude> :sp lst
lst = 1 : 4 : 9 : _
Prelude> length lst
10
Prelude> :sp lst
lst = [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

20151121