如何测试一个列表中的整数是否可以被另一个列表中的整数整除?

时间:2014-09-29 10:59:46

标签: list haskell

我正在尝试创建一个函数,该函数接受Intn)和k的{​​{1}}列表,并返回所有数字的总和Int,可以被列表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

我试图弄清楚,但还没有理解。 非常感谢所有帮助。

1 个答案:

答案 0 :(得分: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]

这里我们使用类型为any的内置函数(a -> Bool) -> [a] -> Bool(即它获取谓词函数,值列表,并返回一个布尔值)。

请注意我在此处调用您的k列表ks,以表明它是“k”的列表。这在Haskell中是惯用的。