使用map和concat将列表推导转换为定义

时间:2015-07-05 21:20:08

标签: haskell list-comprehension

使用Haskell进行功能性思考,第67页:

[...] list comprehensions are translated into equivalent definitions in
terms of map and concat. The translation rules are:

[e | True]       = [e] 
[e | q]          = [e | q, True] 
[e | b, Q]       = if b then [e | Q] else [] 
[e | p <- xs, Q] = let ok p = [e | Q]
                       ok _ = []
                   in concat (map ok xs)

作者无处定义e,q,Q或b。我认为这是第一种方式&#34;表达,&#34;但我以前从未见过其他人。有人可以赐教我吗?

2 个答案:

答案 0 :(得分:4)

此翻译直接来自官方Haskell Report,其中有另外一句话:

  

其中<Root> <Page1> <content> This is content 3 </content> </Page1> <Page2> <content> This is content 1 </content> </Page2> <Page3> <content> This is content 2 </content> </Page3> </Root> 范围超出表达式,e超过模式,p超过列表值表达式,l超过布尔表达式,b超过声明列表, decls超过限定符,q超过限定符序列。 Q是一个新变量。函数ok和布尔值concatMapTrue中定义。

如果您想知道这些条款的含义,报告还有更多细节。

答案 1 :(得分:2)

我猜是这样的:

  • e是任何表达,如你所说
  • q是Bool
  • 类型的任何表达式
  • b也是Bool类型的任何表达式(这看起来有点奇怪,但也许我错了......)
  • p是任何模式。例如,Right xJust _x@(y,z)
  • Q是一串用逗号分隔的列表理解元素。 “list comprehension element”我指的是守卫(即Bool类型的表达式)或模式匹配,例如x <- xsRight x <- xs