目前代码哈斯克尔模式匹配问题
您好我有这样的功能:
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]
目前代码哈斯克尔模式匹配问题
您好我有这样的功能:
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]
看看以下功能:
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)
(有关名单,既map
和fmap
做同样的事情fmap
是map
泛化)
+1为翔实的答案!让海报去思考这样的概括(哈斯克尔的面包和黄油!)是很好的。 – MGwynne 2011-06-07 18:34:32
'jj ::(Functor f,Integral i)=> f i - > f i'也可以使用,因为您使用的是'fmap'。 – Alex 2011-06-07 19:17:51
@Alex好点。 – alternative 2011-06-07 20:16:04
如果你想在[]语法(又名。列表理解),你可以说
jj::[Int]->[Int]
jj xs = [x `mod` 2 | x<-xs]
这相当于MGwynne的map
解决方案。
太糟糕的列表理解不是无点的。 – alternative 2011-06-07 18:44:01
如果我们足够了解Haskell关心无点解决方案的信息,我确信在这两种解决方案之间的转换不会花太多功夫! – yatima2975 2011-06-07 19:05:26
的递归的方式:
dividablelist :: [Int] -> [Int]
dividablelist [] = []
dividablelist (x:xs) = mod x 2 : dividablelist xs
你应该阅读有关'fmap'功能。 – 2011-06-07 18:14:33
这是功课吗?顺便说一下,244可以被2整除...... – alternative 2011-06-07 18:19:40
这是nt home work ..即使这是nt我所需要的.. justt发布了这个测验,以获得一个简单的想法如何建立 – Sudantha 2011-06-07 18:22:00