Travel With Haskell 3 - 列表推导式
什么是列表推导式
Haskell 列表推导式与Python十分的相似,可以理解为从列表元素中筛选(过滤)出符合条件的值。
格式
在Haskell中,列表推导式大概长这个样子:
[x|description][x|description]
乍一看以为是数学集合的描述法,其实真的长得差不多。准确来说,后面的一部分应该叫做predicate(限制条件)。
比方说想要从1-10中筛选出偶数,可以这样写
[x|x<-[1..10], x `mod` 2 == 0]
再比如说我们想要从1-100中筛选出 所有模13余2的数字
[x|x<-[1..100], x `mod` 13 == 2]
再比如说我们想要获得x = {1,2,3}, y = {7,8,9} 两个集合的笛卡尔积。
[x*y|x<-[1..3], y<-[7..9]]
是不是感觉和集合的描述没什么区别。
前面的是代表元素,后面的是元素的限制。当然,列表推导式也可以对字符进行操作。看下面的一个小栗子。
> bb x = [if x < 10 then "hhh" else "NONONO" | x<- x]
> bb [1,2,3,45]
["hhh","hhh","hhh","NONONO"]
首先声明了一个函数叫做bb,他的参数是x,后面是一个列表推导式,当且仅当x小于时的时候,将该元素变为”hhh”,否则为“NONONO”。
你可能注意到了,这里x是由二义性的,为了避免这个问题,我们最好不要这样使用。
未完待续…