2014-05-07 67 views
0

我想在haskell中編寫函數,我希望該函數只求和奇數和3的列表中的元素相除。如何總結haskell中的元素(奇數除以3)

我的代碼是:

nieplist n = (n/2 > 1) && mod n 3 == 0 
niepdodlist xs = sum $ filter nieplist xs 

我認爲一切都應該工作,首先,我檢查,如果從列表編號爲奇數後,我要檢查,如果它是由3(數字模塊3分總是將0)

當我嘗試寫:

*Main>niepdodlist [1,2,3,6] 

結果是

<interactive>:220:1: 
No instance for (Integral a0) arising from a use of `niepdodlist'... 


<interactive>:220:14: 
No instance for (Num a0) arising from the literal `1' 
The type variable `a0' is ambiguous... 

結果應該是:

*Main>niepdodlist [3,6,3] 
>9 

解決方案(感謝@kqr)

nieplist n = odd n && mod n 3 == 0 
niepdodlist xs = sum $ filter nieplist xs 

回答

3

如果您正在尋找奇數,這樣的:(n/2 > 1)可能是錯誤的。您可能想嘗試用odd n替換它。它恰好是odd是標準庫中的一個函數!

你得到這樣一個可怕的錯誤的原因是因爲除法運算符(/)只能用於小數,但模函數(mod)只能與整數一起使用。所以類型檢查器會對你想要n是一個整數還是浮點數感到困惑。

但是請記住,根據您的問題的說明中,

niepdodlist [3,6,3] 

結果應該是6,而不是12!由於6是偶數,因此不計入總數。

+0

非常感謝你我的朋友,這有助於;) 但你是正確的,這是6,如何對之數? 哦,不,我很愚蠢。對不起,沒關係。 我會在我的問題中編寫解決方案。 –

0

對於該錯誤,函數(/)定義爲(/) :: Fractional a => a -> a -> a,但功能modmod :: Integral a => a -> a -> a。正如你所看到的,一個使用小數,另一個使用積分。一種解決方案是使用div或quot(你可以使用反引號插入)。

5`div` 2 = 2

對於邏輯,以測試是否一數量是奇數,你應該只測試n % 2 == 0(n/2 > 1)不完成相同的結果(任意數量大於3將做吧!)。

這個函數也是列表解析的一個很好的例子。

niepdodlist xs = sum [x | X < - XS,奇X,X mod 3 == 0]