komorebikoboshiのブログ

プログラミング記事(趣味レベル)が多め。

最近読んでいる本

図書館でこの本を借りてきた。

コンピュータサイエンス入門〈1〉アルゴリズムとプログラミング言語

コンピュータサイエンス入門〈1〉アルゴリズムとプログラミング言語


興味を持ったきっかけなのだけど、この本でソースコード例などに使われているのが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が必要だったり細かい用語の違いはあるけど本当にそっくり。