More Related Content Similar to 磯野ー!関数型言語やろうぜー! (20) 磯野ー!関数型言語やろうぜー!2. 中の人
@razon ● 角田裕樹
id:razon ● 天領倉敷Scala
言いだしっぺ
● 岡山Javaユーザ会
戦闘員A
● TDDBC岡山
戦闘員D(くらい)
● ハッシュタグレイパー
● 普段はJavaとか
● Excel方眼紙爆発しろ
2/40
4. おしながき
● 関数型言語とは?
● どんな言語があるの?
● 関数型言語のエッセンス
4/40
7. 関数型言語とは?
● 関数がファーストオブジェクト
● 関数を変数に代入できる
● 関数の引数に関数型を指定できる
● 関数の戻り値に関数型を指定できる
7/40
9. OCaml
● Objective Caml
● ML系
● 中の人の関係で名古屋に使い手が多い
9/40
10. F#
● OCamlの影響を強く受ける
● .Net Framework上で動作
● 実はOSS
(Apache 2.0ライセンス)
10/40
11. Haskell
● 純粋関数型言語
● 遅延評価
● 状態を持たない(変数への再代入ができない)
11/40
12. Scala
● JVM上で動作(.Net向け実装も開発中)
● オブジェクト指向と関数型のハイブリッド
12/40
14. 文から式へ
● 手続き型言語
● 命令文を順に実行していく
● 関数型言語
● 式を組み合わせて処理を行う
14/40
15. 文から式へ
● ifやforも文ではなく式(値を返す)
● 入力値から出力値へ、関数(式)を繋げて
値を変換する
15/40
17. 副作用
● とある機能で、実行時に戻り値以外の何かしら
の値を変更すること
● いわゆる破壊的操作
● I/O
17/40
18. 副作用
● とある機能で、実行時に戻り値以外の何かしら
の値を変更すること
● いわゆる破壊的操作
● I/O
class Clazz {
var n = 0
def inc { n += 1 } // 副作用がある
def sum(a: Int, b: Int) = a + b // 副作用がない
}
18/40
19. 副作用
● 関数型言語では、原則として副作用が存在しな
いものとみなす
● ※非純粋関数型言語では破壊的操作を行えるが、
極力行わないようにする
19/40
20. 副作用
● 副作用がない=同じ引数の場合は必ず同じ結果
となる(参照透過性)
● テストが容易になる
● 並列処理に向いている
20/40
21. 再帰によるループ処理
● forやwhileによるループには副作用がある
→カウンタ変数や、計算結果を格納する変数
var count = 0
var result = 0
while (i < 10) {
result += i
i += 1
}
21/40
22. 再帰によるループ処理
● forやwhileによるループには副作用がある
→カウンタ変数や、計算結果を格納する変数
var count = 0
var result = 0
while (i < 10) {
result += i
i += 1
}
● 再帰によるループで副作用を取り除く
def sum(i: Int): Int =
if (i <= 0) i else i + sum(i - 1)
22/40
23. 再帰によるループ処理
● 再帰の階層が深くなるとスタックオーバーフ
ローが発生する
● 末尾再帰に書き直すことで、最適化が行われて
スタックオーバーフローが発生しなくなる
● 末尾再帰:関数の一番最後で自分自身を再帰呼
び出しする関数
def sum(i: Int): Int = {
def s(i: Int, acc: Int) =
if (i <= 0) i else i + s(i – 1, acc + i)
s(i, 0)
}
23/40
25. 型安全
val year = 2011
val month = 10
year + month
● コンパイラはエラーを出さないが、
正しい処理をしているか?
25/40
26. 型安全
case class Year(year: Int) {
def +(v: Year) = Year(year + v.year)
}
case class Month(month: Int) {
def +(v: Month) = Month(month + v.month)
}
scala> Year(1) + Month(2)
<console>:12: error: type mismatch;
found : Month
required: Year
Year(1) + Month(2)
^
scala> Year(1) + Year(2)
res11: Year = Year(3)
26/40
29. モナド
● 計算機科学におけるモナドとは、Eugenio
Moggiによって提案されたモジュール性を持た
せた表示的意味論の枠組みを言う。プログラム
とはクライスリ射である、という要請からクラ
イスリトリプル(Kleisli triple)というモナド
と同値な関係にあるものが実際上は使われる。
プログラミング言語のHaskellで用いられるも
のがよく知られている。
● モナドの名称は、圏論のモナド(モノイド+ト
ライアド)に基づいており、ライプニッツのモ
ナド(単子論)とは無関係である。
29/40
31. モナド
● 誤解を恐れずに言うならば一種のイディオム
(デザインパターン)
● 入力値から出力値へ、式を組み合わせて処理を
行っていく際に、式と式を繋げるための統一さ
れた仕組み
31/40
32. モナド
● 「モナド則」というものを満たしている型同士
は容易に式を繋ぐことができる
● (かなり話は飛んで)モナドをよしなにして、
参照透過性と保ちつつ状態を持ったり、入出力
を取り扱ったりできる
32/40
39. まとめ
● 魔法少女Scalaちゃんハァハァ
● 名古屋は多分こわくない
● Excel方眼紙爆発しろ!
39/40