【问题标题】:How to access a member in a list on Ocaml如何访问 Ocaml 列表中的成员
【发布时间】:2015-03-03 11:09:52
【问题描述】:

我在下面有一个源代码。我不明白它的语法。 [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 ]

【问题讨论】:

标签: list ocaml camlp4


【解决方案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 中也不常见。

附:以及示例表达式

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

在原版 OCaml 中是

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

【讨论】:

  • 这很可疑。我觉得这个理解更等于cartesian_product xs ys |&gt; List.map (fun (x,y) -&gt; x+y)
  • 是的,看起来你是真的,让我来修复帖子。谢谢
  • 我觉得又有问题了。函数symbols 返回一个列表,但您似乎期望一个信号值。也许您需要在某处添加concat....
猜你喜欢
  • 2012-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多