[ ] (* 空リスト *) 1 :: [2; 3; 4] (* リストの先頭に要素を追加; cons操作 *) List.hd [1; 2; 3] (* リストの先頭要素 *) List.tl [1; 2; 3] (* リストの先頭要素以外 *) [1; 2; 3] = [1; 2; 3] (* リストの比較 *) match [1; 2; 3] with ... (* リストのパターンマッチ *)これらのうち、match式を処理するのは大変であるので、 それ以外の処理を実装しよう。まず、expと valueの拡張である。
type exp = ... | Empty (* [ ] *) | Cons of exp * exp (* e :: e *) | Head of exp (* List.hd e *) | Tail of exp (* List.tl e *) ... type value = ... | ListVal of value listリストに対するCons操作 ( 1 :: [1; 2; 3] における :: の操作) の処理を以下に記述する。
(* eval5 : env -> (string * value) list -> value *) let rec eval5 e env = ... match e with ... | Cons(e1,e2) -> begin match (eval5 e1 env, eval5 e2 env) with | (v1,ListVal(v2)) -> ListVal(v1 :: v2 end ...やや読みにくい感じもあるが、非常に簡潔に処理できることがわかるであろう。 Cons 以外の操作も全く同様であるので省略する。
亀山幸義