2015-11-07 84 views
1

在我的课程之一,我碰到这样的:Haskell中的x <-x是什么意思?

numbers xs = [x | x<−xs , even x] 

我明白,它需要号码列表,并创建只与甚至从原来的列表编号形成另一个列表。它究竟如何做到这一点? x<-xs是什么意思?

+0

,它意味着“采取列表中的每个元素'xs'并依次用'x'替换每个这样的元素。更一般地说,在monadic上下文中(一个do块),它意味着名称绑定到monadic动作的返回值。 –

+0

阅读[list comprehension](https://wiki.haskell.org/List_comprehension)。 – Bakuriu

回答

5

这是一个list comprehension其中符号被设计为类似于set builder notation与对应于程式化小写希腊语的ε-这对于集成员资格的标准符号令牌<-。当我阅读列表解析时,我倾向于将<-读作“从...中抽取”,因此我会将[x | x<−xs , even x]解析为“所有x的列表,使得x从xs绘制,并且x是偶数”(,对应于and并且用于添加条件不仅仅是列表中的成员资格)。

0

正如其他答案所述,这是一个列表理解符号,这意味着根据另一个列表定义一个列表。如果在|之后的部分中指定了一些谓词,则将仅采用满足这些谓词的元素,例如[x | x <- xs, even x]是从列表xs中取得的所有那些元素的列表,它们是偶数(满足条件even x)。可以有不止一个断言:

[x | x <- xs, even x, x > 10] 

您也可以将转换应用于绘制的元素,包括更改列表类型:

λ> [x*2 | x <- [1 .. 20], even x, x > 10] 
[24,28,32,36,40] 

或:在这种情况下

λ> [show x | x <- [1 .. 20], even x, x > 10] 
["12","14","16","18","20"]