Haskell映射函数,返回不带零的列表

时间:2018-10-28 21:04:51

标签: haskell

这是我的代码:

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]

1 个答案:

答案 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]的列表,介于两者之间的所有元素(根据您的功能)将被映射为零。通过跳两,我们避免了首先计算这些值。但这当然仅适用于这种特定情况。