如何访问Ocaml列表中的成员

时间:2015-03-03 11:09:52

标签: list ocaml camlp4

我的源代码如下。我不明白它的语法。 [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 ]

1 个答案:

答案 0 :(得分:1)

这是list comprehension的非标准语法。我不知道任何记录它的书。这个想法应该类似于set builder notation。简而言之,此表达式将被评估为列出:

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

其中expr应评估为列表,p将分配给列表的相应元素,以便p * 2 - 1将应用于原始列表的每个元素。

在正常的OCaml语法中,这可以表示为

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

作为最后一点,我不会suggest你使用这个列表理解符号。它首先没有工具支持,并且在现代OCaml中并不常见。

P.S。和示例表达

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

in vanilla OCaml

f :: List.(map symbols ts |> concat)