这是我的代码:
x = map classify[1..20]
classify :: Int -> Int
classify n
| n `mod` 2 == 0 = n + 2
| otherwise = 0
Run Code Online (Sandbox Code Playgroud)
调用x时,它返回一个列表
[0,4,0,6,0,8,0,10,0,12,0,14,0,16,0,18,0,20,0,22]
Run Code Online (Sandbox Code Playgroud)
如何指定我只想要不是0的数字列表:
[4,6,8,10,12,14,16,18,20,22]
Run Code Online (Sandbox Code Playgroud)
你可以使用一个filter :: (a -> Bool) -> [a] -> [a].此函数接受一个函数(a -> Bool称为"谓词" 的类型)和一个列表,它生成一个满足谓词的值列表(返回True该元素).
所以你可以用以下方法过滤掉零:
filter (0 /=) mylist
Run Code Online (Sandbox Code Playgroud)
对于您的样本列表,这会生成:
Prelude> filter (0 /=) [0,4,0,6,0,8,0,10,0,12,0,14,0,16,0,18,0,20,0,22]
[4,6,8,10,12,14,16,18,20,22]
Run Code Online (Sandbox Code Playgroud)
话虽这么说,对于这种特殊情况,你可以通过制作"跳2"来省去自己生成这些元素的麻烦:
x = map classify [2, 4..20]Run Code Online (Sandbox Code Playgroud)
因此map,这将包含一个列表,其中包含[2,4,6,8,10,12,14,16,18,20]所有元素 - 给定您的函数 - 将其映射到零.通过制作两个跃点,我们首先避免计算这些值.但这当然只适用于这种特殊情况.