最近読んでいる本
図書館でこの本を借りてきた。
コンピュータサイエンス入門〈1〉アルゴリズムとプログラミング言語
- 作者: 大堀淳,ジャックガリグ,西村進
- 出版社/メーカー: 岩波書店
- 発売日: 1999/05/24
- メディア: 単行本
- クリック: 10回
- この商品を含むブログ (3件) を見る
興味を持ったきっかけなのだけど、この本でソースコード例などに使われているのがMinimal(たぶんこれ→http://www.math.nagoya-u.ac.jp/~garrigue/minimal/)という、まあ名前からも分かるとおりML族のプログラミング言語なんだけど、最初ソースコードを見た時に思わず「F#じゃないか」と(心の中で)呟いてしまったぐらいF#に似ている。まあ、OCamlを見本にしたF#と似ているのは当然なんだけど、これはF#やれっていう啓示だと思うことにしてF#に翻訳しつつ読んでみようと思う。
で、そのなかでちょっとおもしろいコードが出てきた。
この本で使われているMinimalではこんな感じで整数のList型を定義できるらしい。
type List = Nil | Cons of int * List
これを日本語で書くと「List型は、Nil、あるいは、ConsというintとListのペア、である」となる。C#とかで、
class List { int val; List node; public List(int v, List n) { //(省略……)
っていう型宣言を見慣れていた自分にとってはこのシンプルさはびっくり。
そこで、F#で同じことができないかと調べてみたら、判別共用体というものを使えばよいと分かった。
type MyList = | Nil | Cons of int * MyList
ほとんど一緒だ。Listの要素を足し合わせるsumという関数の例も載っていたのでそれも書いてみる。まずは本に載っていたMinimalの例。
fun sum lst = case lst of Nil => 0 | Cons (head, tail) => head + (sum tail) end;
そしてこちらがF#の例。
let rec sum lst = match lst with | Nil -> 0 | Cons (head, tail) -> head + (sum tail)
recが必要だったり細かい用語の違いはあるけど本当にそっくり。