Haskell映射函数,返回没有零的列表

che*_*ire 2 haskell

这是我的代码:

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)

Wil*_*sem 9

你可以使用一个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]所有元素 - 给定您的函数 - 将其映射到零.通过制作两个跃点,我们首先避免计算这些值.但这当然只适用于这种特殊情况.