10

私は今日、ジェイソン・ヒッキーのオンラインブック「Introduction to Objective Caml」を読んでいて、ファンクターの章(140ページ)で、セットファンクターの定義内の次の行に出くわしました。

let add = (::)

コードを実行すると、「構文エラー」エラーメッセージがあまり明るくなりませんでした。ocamlトップレベルにプラグインした後、それ::は実際には演算子ではなく、型コンストラクターであることがわかりました。

しかし、Haskellについて私がほとんど知らないことから、同等の:コンストラクターは演算子(関数)としても扱うことができます。

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

私の質問は:OCamlコンストラクターがファーストクラスの値になったことがない(本のコードが最初から間違っていたことを意味する)、そしてなぜこれが当てはまるのか?

4

1 に答える 1

13

OCamlの前身であるCamlLightでは、コンストラクターが部分的に適用されると関数に昇格する場合がありました。OCamlに移行したときになぜこの機能が削除されたのか正確にはわかりません。これも残念ですが、聞いた説明は「誰もそれを使用していなかった」というものでした。だからList.map Some fooもう...

::唯一のインフィックスコンストラクター(パーサーでハードコードされている)であるため、代数的データ型コンストラクターとしては少し特殊ですが、それ以外は他のデータ型コンストラクターと同じように動作します。

于 2012-12-12T16:57:13.593 に答える