2014-09-29 108 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中是惯用的。

相关问题