目前代碼哈斯克爾模式匹配問題
您好我有這樣的功能:
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