2014-09-29 115 views
3

我試圖創建一個函數,它接受一個Intn),和一個列表Intk秒,返回所有數字1 <= i <= n,通過從列表k整數的至少一個整除的總和。如何測試一個列表中的整數是否可以被另一個列表中的整數整除?

addl::Int -> [Int] -> Int 
addl x [] = 0 
addl x (y:ys) = if ((map [1..x] `mod` y) == 0) 
        then y + addl x ys 
        else 0 + addl x ys 

這是我得到了什麼,但我得到這個消息:

Couldn't match expected type `a0 -> b0' with actual type `[t0]' 
    In the first argument of `map', namely `[1 .. x]' 
    In the first argument of `mod', namely `map [1 .. x]' 
    In the first argument of `(==)', namely `(map [1 .. x] `mod` y)' 

,我一直試圖弄清楚,只是還沒有認識。 所有幫助非常感謝。

+0

你想用地圖完成什麼?地圖需要一個函數和一個列表,所以你的簽名是錯誤的。 – wvdz 2014-09-29 11:08:39

+0

試圖確保其在MODS [1..X]每一個數字,其中y – Haskellnewb27 2014-09-29 11:10:36

+0

您的意思是'ADD1 NK = SUM $過濾器(\ X - >任何((== 0)MOD x)的K)1 ..?]'? – Vektorweg 2014-09-29 11:16:59

回答

3

map需要一個函數作爲它的第一個參數,但是你提供一個列表。

錯誤消息說的很多。這表明表達((map [1..x] `mod` y) == 0)被解析爲

(==) -- In the first argument of `(==)', namely `(map [1 .. x] `mod` y)' 
    mod  -- In the first argument of `mod', namely `map [1 .. x]' 
     map [1..x] -- In the first argument of `map', namely `[1 .. x]' 
     y 
    0 
     -- Couldn't match expected type `a0 -> b0' with actual type `[t0]' 

map的類型是

Prelude> :t map 
map :: (a -> b) -> [a] -> [b] 

Prelude> :t [undefined] 
[undefined] :: [a] 

(a1 -> b1)[a2]不匹配。

而是在你的代碼的兩個動作(濾波和求和)混合,容易混淆(你甚至總結了錯誤的變量y那裏),這是簡單的過程模塊化先搜索,也只有這樣,總結:

addl::Int -> [Int] -> Int 
addl n ks = sum           -- then, sum 
       [i | i <- [1..n], isDividedByAny i ks] -- first, search 
    where 
    isDividedByAny i ks = 
     any 
      [ rem i k == 0 | k <- ks] 

這裏我們使用(a -> Bool) -> [a] -> Bool類型(即它得到一個謂語功能,值的列表,並返回一個布爾值)的內置函數any

請注意我在這裏打電話給您的k列表ks,以表明它是「k」列表。這在Haskell中是慣用的。

相關問題