这是我的代码:
x = map classify[1..20]
classify :: Int -> Int
classify n
| n `mod` 2 == 0 = n + 2
| otherwise = 0
调用x时,它返回一个列表
[0,4,0,6,0,8,0,10,0,12,0,14,0,16,0,18,0,20,0,22]
如何指定我只希望数字不是0的列表:
[4,6,8,10,12,14,16,18,20,22]
答案 0 :(得分:9)
您可以为此使用filter :: (a -> Bool) -> [a] -> [a]
。此函数接受一个函数(类型为a -> Bool
的“谓词”)和一个列表,并生成一个满足该谓词的值的列表(该元素返回True
)。
因此您可以使用以下方法过滤掉零:
filter (0 /=) mylist
对于您的样本列表,这将生成:
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]
话虽如此,对于这种特定案例,通过创建“ 2跳”,您可以免去最初生成此类元素的麻烦:
x = map classify [2, 4..20]
因此,这将map
包含[2,4,6,8,10,12,14,16,18,20]
的列表,介于两者之间的所有元素(根据您的功能)将被映射为零。通过跳两,我们避免了首先计算这些值。但这当然仅适用于这种特定情况。