2011-06-07 102 views
1

目前代码哈斯克尔模式匹配问题

您好我有这样的功能:

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]

+1

你应该阅读有关'fmap'功能。 – 2011-06-07 18:14:33

+1

这是功课吗?顺便说一下,244可以被2整除...... – alternative 2011-06-07 18:19:40

+0

这是nt home work ..即使这是nt我所需要的.. justt发布了这个测验,以获得一个简单的想法如何建立 – Sudantha 2011-06-07 18:22:00

回答

5

当然,你只想映射:

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

由于钻营

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] 
+0

简单明了! – Sudantha 2011-06-07 18:29:08

+0

也可以写'map(。&。1)',这在某些情况下会更有效率。 – fuz 2011-06-07 18:47:58

3

看看以下功能:

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

其中列表是typeclass仿函数的实例。你需要一个类型为Int -> Int的函数来完成你的转换。

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

(有关名单,既mapfmap做同样的事情fmapmap泛化)

+0

+1为翔实的答案!让海报去思考这样的概括(哈斯克尔的面包和黄油!)是很好的。 – MGwynne 2011-06-07 18:34:32

+1

'jj ::(Functor f,Integral i)=> f i - > f i'也可以使用,因为您使用的是'fmap'。 – Alex 2011-06-07 19:17:51

+0

@Alex好点。 – alternative 2011-06-07 20:16:04

4

如果你想在[]语法(又名。列表理解),你可以说

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

这相当于MGwynne的map解决方案。

+1

太糟糕的列表理解不是无点的。 – alternative 2011-06-07 18:44:01

+2

如果我们足够了解Haskell关心无点解决方案的信息,我确信在这两种解决方案之间的转换不会花太多功夫! – yatima2975 2011-06-07 19:05:26

2

的递归的方式:

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