2012-12-12 8 views
8

私は今日Jason Hickeyのオンラインブック「Objective Camlの紹介」とFunctorsの章(140ページ)の章でSet Functorの中の次の行を読みました定義:OCamlではなぜリストコンストラクタは::演算子ではない

let add = (::) 

コードを実行すると、「構文エラー」というエラーメッセージが表示されませんでした。 ocamlトップレベルへのプラグインの後、私は::が実際には演算子ではなく、むしろタイプコンストラクタであることを理解しました。

しかし、私がHaskellについて知っていることから、相当する:コンストラクタは演算子(関数)としても扱うことができます。

Prelude> :t (:) 
(:) :: a -> [a] -> [a] 

私の質問がある:OCamlのコンストラクタは、最初のクラスの値(本からのコードが最初から間違っていたことを示唆している)とされていなかった理由は、このケースですか?

+0

私は通常この問題を解決する(演算子をラムダに変換する) '(fun x y - > x :: y)'を使います。ちょっと迷惑ですが、うまくいきます。また、 '::'が関数であっても、スワップされた '::'の引数が必要なときはいつでも同じことをしなければならないので、その点では意味があると思います。 –

答えて

10

OCamlの前身であるCaml Lightでは、以前は部分的に適用されていたときに、機能に昇格されたコンストラクタが使用されていました。 OCamlに移ったときになぜこの機能が削除されたのか正確にはわかりませんが、これも嘆いていますが、私が聞いた説明は誰も使っていませんでした。それは(パーサにハードコード)のみ中置コンストラクタですが、それ以外は他のデータ型のコンストラクタのように振る舞うように、もう何List.map Some foo ...

::は、代数的データ型のコンストラクタとして少し特別ではありません。

+0

私は "誰もそれを使用していません"という説明を聞いて覚えていません。モチベーションは、関数とコンストラクタの違いを強調することだったと思います... – lukstafi

+1

これは興味深い話です。私はCaml Lightを使って「プログラミングのための機能的アプローチ」を同時に読んでおり、OCaml(fun定義、let-in-where形式、組み込み関数合成演算子のデフォルトパターンマッチング)よりも言語が優れていることがいくつかあります。 – PetarMarendic

+3

Xavierは10年以上前に答えました:http://caml.inria.fr/pub/ml-archives/caml-list/2001/08/47db53a4b42529708647c9e81183598b.fr.html – camlspotter

関連する問題