ML

OCamlとSMLの違い (6)

ML

関数の引数にラベルを付けることができる。 # let foo ~a ~b = a / bラベルを指定してカリー化できる。 # (foo ~a:6) ~b:3 # (foo ~b:3) ~a:6全部の引数を与える場合、ラベルは省略できる。 # foo 6 3

OCamlとSMLの違い (5)

ML

tupleの最初の項が関数のとき、tupleのまま適用できる。 # (fun x -> x + 1, "a") 4;; -: int*string = (5,"a")

引数の評価順序

ML

Objective Caml 入門によると、引数が複数ある場合の評価順序は、言語仕様としては決まっていないようだ。 現実の実装はどうなっているのか調べてみた。 SML/NJ: 前の引数から評価される OCaml: 後ろの引数から評価される

OCamlとSMLの違い (4) 中置演算子

ML

前置記法 SML: op ^ OCaml: (^) 型が異なる SML: op ^ : string * string -> string OCaml: (^) : string -> string -> string

OCamlとSMLの違い (3)

ML

レコード型を使用する前にtype宣言で宣言しなければならない SMLのデータ型のことを、バリアント型と呼ぶ 「データ型」という名前は何を指しているのか分かりにくいので、別の名前にするのは良いと思う。

OCamlとSMLの違い (2)

ML

nilが定義されていない リストの項目の区切りが、カンマではなくセミコロン SML: [1, 2, 3] OCaml: [1; 2; 3] 無名関数の構文 SML: fn arg => body OCaml: fun arg -> body 場合分けの構文 SML: case ... of ... OCaml: match ... with ... 例外の処理 SML: …

OCamlとSMLの違い (1)

ML

Objective Caml 入門を読み始めた。Standard MLとの違いが予想よりも大きい。 実数型の名前: real ==> float char型のリテラル表記: #"c" ==> 'c' 変数名の最初の文字に大文字は不可 「if...then...else...」式のelse以下が省略可能(但しunit型に制限される)

fun構文

ML

fun len [] = 0 | len (h::t) = 1 + len t;この書き方は、どうも納得いかない。 は関数適用よりも結合度が弱いので、(h::t)のように括弧が必要になるのはわかるが、fun構文の中だけ特別扱いしても良いのではないかと思う。先頭は関数名に決まっているのだか…

Standard ML of New Jersey

ML

SML/NJ 110.0.7をFedora Core 4にインストールしようとして、途中でエラーになった。最新版の110.60だと上手くいった。