反省はしても後悔はしない

Vim とか備忘録とか。それと関数型言語勉強中

F# の判別共用体で電卓もどきを作った

リリカル合宿というハッカソンに参加してきました。
そこでやったことを忘れないうちにメモ。

bleis さんに手伝ってもらいながら超簡単な電卓もどきみたいなものを作りました。
例えば、

3 + 4 + 4

というような計算式を入力すると

11

を出力します。
ただし、文字列をパースして計算式にするのは大変なので、入力となる計算式はコード中に直書きしました。あと、めんどいので足し算だけです。
以下ソース

module Calculator

type Expr =
| Plus of Expr*Expr
| Number of int

let rec eval = function
| Plus (a, b) -> eval a + eval b
| Number n -> n

let rec to_string = function
| Plus (a, b) -> to_string a + " + " + to_string b
| Number n -> string n

[<EntryPoint>]
let main _ =
    let e1 = Plus (Plus (Number 3, Number 4), Number 4)

    printfn "%d" <| eval e1      (* 11 *)
    printfn "%s" <| to_string e1 (* 3 + 4 + 4*)
    0

ポイントは判別共用体を使って計算式を表現するところ。計算式みたいな木構造にはまさにうってつけです。これを C# で実現しようとすると大変なことになります。
F# らしいコードを書くにはこの判別共用体をうまく使うことが大事です。