手探りの私にもわかる気がしている関数型言語3. 自己紹介
Name : 三村 益隆
所属 : 株式会社永和システムマネジメント
サービスプロバイディング事業部4G
旧 コア技術事業部
勤務地: 福井
13. オブラブと関数型言語(1)
2006/05/17 : 西川による「ゆるーいHaskell」が
メルマガにて連載開始
(2008/09/03に全23回にて終了)
2006/12/20 : オブジェクトクラブクリスマスイベントにて
徳井進による講演にて、
「関数型言語とラムダ計算」が話される
14. オブラブと関数型言語(2)
2007/12/21 : オブジェクト倶楽部クリスマスイベントにて
オブジェクトの広場さんによる
「OO厨厨トレイン 未来編」内で、
関数型言語これからくるかもよということ
が話される
2008/09/24 : オブジェクト倶楽部メールマガジン252号にて
森田による S式でCocoaプログラムが書ける
「Nu」の紹介記事
2008/10/30 : ファンクショナル倶楽部秋イベント開催
20. Haskell のご紹介
純粋関数型言語
副作用がない
遅延評価
値が必要とされるまで計算されない
静的型であり、型推論をもつ
パターンマッチがつかえる
モナド
純粋であるために、「副作用」を再発明
ちなみに、僕の好きな関数は、「flip」
24. ラムダ計算がベース
構造として3つしかない簡単な計算モデル
変数
関数適用
関数生成
詳しくは、2006オブジェクト倶楽部クリスマスイベントの
「コンピュータよもやま話」の資料を参考
http://www.objectclub.
jp/download/files/event/2006Christmas/session_f_tokui.
pdf
上記の3つの概念だけで、プログラミングができる
代入が存在しないので、副作用がおきない
25. ラムダ式をHaskellで
関数生成
Prelude> let add = (x -> (y -> x + y))
add :: Integer -> Integer -> Integer
関数適用
Prelude> (x -> (y -> x + y)) 1 3
4
Prelude> let func = (x -> (x -> x * 2 ) $ x + 2)
func :: Integer -> Integer
Prelude> func 10
24
27. 関数を受け取る関数
定番は map
渡されたリストの各要素に引数にきた関数を適用
Prelude> :t map
map :: (a -> b) -> [a] -> [b]
渡されたリストに対して、何もしない
Prelude> map id [1 .. 10]
[1,2,3,4,5,6,7,8,9,10]
渡された数値リストの要素を対応する文字に変換
Prelude Char> map chr [97..122]
quot;abcdefghijklmnopqrstuvwxyzquot;
28. カリー化
ある関数の引き数の一部に値を適用させた関数を
返すようにすること
(+) :: Num (a) => a -> a -> a
inc :: Num (a) => a -> a
inc a = 1 + a
=> inc = (+) 1
(*) :: Num (a) => a-> a -> a
twice :: Num (a) => a -> a
twice a = 2 * a
=> twice = (*) 2
29. Haskell の引数を2つ以上とる関数
実は、引数を2つ以上とる関数は高階関数
Prelude> :t (+)
(+) :: (Num a) => a -> a -> a
Prelude> :t (+) 1
(+) 1 :: (Num t) => t -> t
(+) は
a と a を受け取って a を返す関数( (a -> a) -> a ) ではなく
a を受け取って、a を受け取って a を返す関数を返す関数
(a -> ( a -> a)) である
32. 文字列中の単語を数える
( . ) を使い合体 ( 関数合成 )
wordCount :: String -> Int
wordCount = length . words
Prelude> wordCount quot;foo Fizz buzzquot;
3
ちなみに、(.)
Prelude> :t (.)
(.) :: (b -> c) -> (a -> b) -> a -> c
33. 関数を組み合わせてプログラミング
問題対象領域を小さくして、小さい関数(部品)を作る
関数が小さければテストも楽
後は、そのブロックを組み合わせていけばいいだけ
Haskell みたいな静的型言語なら、組み合わせるとき
のミスをコンパイラが教えてくれる。
コンパイルが通れば、プログラムが完成
ただし、コンパイラが通ったからといって、
正しいプログラムという保証はありません。
ご了承ください。
35. Haskell だと
純粋だから、考えることが少なくなる
副作用で値がとか考えなくていい
型という強い味方がいる
コンパイル時に関数の組み合わせのエラーを教えてくれる
先に関数の型を考えることで何が欲しいかを見失わない
型推論があるので、単純なら定義しなくていい
ということで、Haskell すごくおすすめ
40. Arc - http://arclanguage.org/ -
みんな大好きポール・グレアムの作った 新
しい Lisp 方言
「ハッカーと画家」にてペーパーウェアとして紹介
2008 年 01 月 29 にリリース
Mzscheam v352 で実装されている
プログラムをいかに手早く短くかくかを目的として設計
quot;it's a quick and dirty language for writing quick
and dirty programs.quot;
Hacker News は arc で書かれている
http://news.ycombinator.com/
42. Arc の特徴
今まで長くわかりづらかった表現が短くかける
lambda => fun
defun => def
Ascii しか扱えない
文字コードに悩まされるなら、言語のチカラを
作りたい
46. 見た目がだいたいHaskell
pure で階乗計算
> fact 1 = 1;
> fact n = n * fact (n - 1);
> fact 1;
1
> fact 5;
120
47. 置き換え計算モデル
変数を置き換え可能なところまで、評価していく
> two = x + y;
> two ;
x+y
> x = 1;
> two ;
1+y
> y = 1 ;
> two ;
2
50. Clojure - http://clojure.org/ -
JVM上で動く Lisp
Common Lisp と Scheam の中間
Clojure開発用のelisp , vim のsyntax file, netbeans 用の開発環
境も整っている
lambda は fn
関数のオーバーロードも可能
並行プログラミングを意識している
末尾最適化されないので、recur をつかう
51. Clojure で swing
JVMで動くので、簡単に Java のライブラリが使用可能
(. javax.swing.JOptionPane (showMessageDialog
nil
quot;Hello Worldquot;))