从使用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;但我以前从未见过其他人。有人可以赐教我吗?
答案 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
和布尔值concatMap
在True
中定义。
如果您想知道这些条款的含义,报告还有更多细节。
答案 1 :(得分:2)
我猜是这样的:
Bool
Bool
类型的任何表达式(这看起来有点奇怪,但也许我错了......)Right x
,Just _
,x@(y,z)
Bool
类型的表达式)或模式匹配,例如x <- xs
,Right x <- xs
。