2011-06-07 105 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