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 builder notation。简而言之,这个表达式将被评估为列表:

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

whereexpr 应该评估到列表,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 回答