Haskell模式匹配问题

时间:2011-06-07 18:09:59

标签: haskell pattern-matching

当前代码

嗨,我有这样的功能:

jj::[Int]->[Int]
jj xs = [x|x<-xs,x `mod` 2 ==0]

对于输入 [1..20],它为我提供输出

[2,4,6,8,10,12,14,16,18,20] -> only the values divisible by 2 

我需要什么

如果列表值可以被2分割,则它被解释为0,否则被解释为1

输入[243,232,243]

输出[1,0,1]

4 个答案:

答案 0 :(得分:5)

当然你只想要地图:

jj::[Int]->[Int]
jj xs = map (`mod` 2) xs

由于currying

map (`mod` 2) :: [Int] -> [Int]

正是我们想要的功能,所以我们可以这样做:

jj::[Int]->[Int]
jj = map (`mod` 2)

两者都屈服:

*Main> jj [2,4,5,6,8,9]
[0,0,1,0,0,1]

答案 1 :(得分:4)

如果你想要[]语法(也就是列表理解),你可以说

jj::[Int]->[Int]
jj xs = [x `mod` 2 | x<-xs]

相当于MGwynne的map解决方案。

答案 2 :(得分:3)

查看以下功能:

map :: (a -> b) -> [a] -> [b]
fmap :: (Functor f) => (a -> b) -> f a -> f b

其中列表是类型类仿函数的实例。您需要一个类型为Int -> Int的函数来进行转换。

jj :: (Functor f, Integral i) => f i -> f i
jj = fmap (`mod` 2)

(对于列表,mapfmap都做同样的事情。fmapmap)的推广

答案 3 :(得分:2)

递归方式:

dividablelist :: [Int] -> [Int]
dividablelist [] = []
dividablelist (x:xs) = mod x 2 : dividablelist xs