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