如何测试一个列表中的整数是否可以被另一个列表中的整数整除?
问题描述:
我试图创建一个函数,它接受一个Int
(n
),和一个列表Int
的k
秒,返回所有数字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)'
,我一直试图弄清楚,只是还没有认识。 所有帮助非常感谢。
答
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中是惯用的。
你想用地图完成什么?地图需要一个函数和一个列表,所以你的签名是错误的。 – wvdz 2014-09-29 11:08:39
试图确保其在MODS [1..X]每一个数字,其中y – Haskellnewb27 2014-09-29 11:10:36
您的意思是'ADD1 NK = SUM $过滤器(\ X - >任何((== 0)MOD x)的K)1 ..?]'? – Vektorweg 2014-09-29 11:16:59