这就是我想要发生的事:
[m | m<-[1..1000], k<-[3,5], m `mod` k == 0]
当我把代码放到控制台中时,我得到了我想要的结果,但是当我试图把它变成一个广义函数时,Haskell只是吐出了大量的错误,我不知道如何使它工作。
这就是我所拥有的:
multiplesOfKLessThanN :: Num a => [a] -> a -> [a]
multiplesOfKLessThanN ks n = [m | m<-[1..n], k<-ks, m `mod` k == 0]
problem1 = putStrLn(show(multiplesOfKLessThanN([3,5] 1000)))
main = problem1
一个这样的错误,我得到:
无法将预期类型“Integer -〉[a0]”与实际类型“[Integer]”匹配
我也得到其他错误,但不一致。这是我在Haskell中注意到的,它喜欢改变错误信息,即使代码根本没有改变,就像wtf?
2条答案
按热度按时间vs3odd8k1#
您 对
mutliplesOfKLessThanN
的 使用 不 正确中 的 每 一 个
Haskell 并 没有 将 其 解释 为
将
mutliplesOfKLessThanN
与[3,5]
和1000
一起 使用 。而是 被 解释 为
将
[3,5]
套用 至1000
, 并 将multiplesOfKLessThanN
套用 至 结果 。我 认为 你 的 误解 是 函数 应用 是 如何 发生 的 。 在 许多 语言 中 , 函数 应用 需要 括号 , 例如
f(x)
。 对于 Haskell 来说 , 括号 只 意味 着 " 先 执行 此 操作 " , 而 函数 应用 是 通过 将 内容 放在 彼此 旁边 来 实现 的 。 所以f(x)
在 Haskell 中 是 有效 的 , 因为 它 与f x
相同 ,但是f(x y)
和f(x(y))
是 一样 的 , 它 告诉 Haskell 先 计算x y
, 然后 再 把 它 给f
。对于 您 的 代码 , Haskell 不能 将
[3,5]
作为 函数 应用 , 这 是 Haskell 告诉 您 的 , 它 期望 一 个 函数 ( 实际 上 是 一 个 特定 类型 的 函数 ) 。正确 的 写法 应该 是
格式
这 应该 可以 处理 您 所 得到 主要 错误 。
falq053o2#
所以这里的错误是类型错误,因为你试图让一个更通用的类型a被函数modulo使用。如果你看类型mod,它期望一个整型类,把你的约束从Num改为Integral应该可以解决你的问题