だから私は読んでいた http://www.podval.org/~sds/ocaml-sucks.html、この引用を含む(ocamlの問題のコンテキストで):
実際には、わずかに異なる3つの構文があります。
- 公式のものはマニュアルに記載されています
- そのスーパーセットは、コンパイラocamlcによって受け入れられます
- 類似したもの異なる)プリプロセッサCamlp4によって受け入れられます(たとえば、List.map [1; 2; 3]を受け入れます) 〜f:fun x-> x。トップレベルでも受け入れられますが、受け入れられません。 コンパイラ)
ocamlcで受け入れられるが、マニュアルと一致しないocamlコードフラグメントの例は何ですか?
PS-私は主にOCaml 4.00.1に興味がありますが、以前のバージョンも興味深いです...
回答:
回答№1は5好奇心のみを目的とした面白い例:
OCaml version 4.00.0
# type "a weird_list =
| ()
| :: of "a * "a weird_list;;
type "a weird_list = () | :: of "a * "a weird_list
# 1::2::3::();;
- : int weird_list = :: (1, :: (2, :: (3, ())))
Camlp4とOCamlの違いコンパイラは時々バグですが、ほとんどの場合、パーサー技術の違いによって説明されます:穏やかな迷惑な構文の微妙さで同じ言語の慣用的なLRパーサーとLLパーサーを書く場合、両方が完全に一致することを期待すべきではありません。これは実際には問題ではないと思います(しかし、実際にはほとんどの人はCamlp4を使用しません)。
回答№2については2
このページはかなり古いですが、確かではありませんが、すべてのポイントに当てはまります。
3番目の項目は、ocaml 4.00トップレベルを考慮してfalseです(List.mapのパラメーターの順序が間違っていることも考慮してください...):
$ List.map ~f:fun x -> x [1;2;3];;
Error: Syntax error
$ List.map ~f:(fun x -> x) [1;2;3];;
File "", line 1, characters 12-24:
Error: The function applied to this argument has type "a list -> "b list
This argument cannot be applied with label ~f
知る限り、トップレベルはocamlと同じコードを使用してコードを解析します...