list comprehension
list comprehension 相当于map 和 filter的函数的增强版, | 之前等于map, | 之后等于filter, 尤其在多限制条件和同时实现map,filter功能时更加明显。是个非常强大和有用的特性,完全可以替代列表的 map 和 filter 函数。
list comprehension 其实是由 monad 或 applicative functor 生成的语法糖。
[x*2 | x <- [1..10], x*2 >= 12] -- 取乘以 2 后大于等于 12 的元素, 等于map结合filter
> [12,14,16,18,20]
[if x `mod` 2 == 0 then "even" else "odd" | x <- [1..10]] -- 偶数转换为even,基数为odd, 等于map
> ["odd","even","odd","even","odd","even","odd","even","odd","even"]
[ x | x <- [10..20], x /= 13, x /= 15, x /= 19] -- 取除了13、15、19之外的元素,多个限制条件,等于filter
> [10,11,12,14,16,17,18,20]
[ x*y | x <- [2,5,10], y <- [8,10,11]] -- 求两个列表所有可能的组合
> [16,20,22,40,50,55,80,100,110]
-- 嵌套的列表, 在不拆开它的前提下除去其中的所有奇数
let xxs = [[1,3,5,2,3,1,2,4,5],[1,2,3,4,5,6,7,8,9],[1,2,4,2,1,6,3,1,3,2,3,6]]
[ [ x | x <- xs, even x ] | xs <- xxs]
> [[2,2,4],[2,4,6,8],[2,4,2,6,2,6]]
--取得所有三边长度皆为整数且小于等于 10,周长为 24 的直角三角形
[ (a,b,c) | c <- [1..10], b <- [1..c], a <- [1..b], a^2 + b^2 == c^2, a+b+c == 24]
> [(6,8,10)]
参考资料
《HASKELL 趣学指南》
《Real World Haskell》