0

以下にソースコードがあります。その構文がわかりません。 [g | t <- ts; g <- symbols t]は非常に奇妙です。それを説明したり、それに関連する本や文書を推薦したりするのを手伝ってください. どうもありがとうございました

type term = V of string | F of string * term list

let rec symbols = function
  | V x -> [x]
  | F (f, ts) -> f :: [ g | t <- ts; g <- symbols t ]

let rec functions = function
  | V _ -> []
  | F (f, ts) -> f :: [ g | t <- ts; g <- functions t ]
4

1 に答える 1

1

これは、リスト内包表記の非標準構文です。それを説明している本を私は知りません。アイデアは、 set build 表記法に似ている必要があるということです。つまり、この式は次のように評価されます。

 [ x | p <- expr; p * 2 - 1 ]

expr リストに評価される必要がある場所はp 、リストの対応する要素に割り当てられるためp * 2 - 1、元のリストの各要素に適用されます。

通常の OCaml 構文では、これは次のように表現できます。

List.map (fun p -> p * 2 + 1) xs 

最後に、このリスト内包表記を使用することはお勧めしません。まず第一に、ツールのサポートがなく、とにかく最近の OCaml では一般的ではありません。

PSそして表現例

f :: [ g | t <- ts; g <- symbols t ]

バニラOCamlでは

f :: List.(map symbols ts |> concat)
于 2015-03-03T11:23:02.443 に答える