haskell 将包含列表的多个参数传递给函数

hlswsv35  于 2022-11-14  发布在  其他
关注(0)|答案(2)|浏览(148)

这就是我想要发生的事:

[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?

vs3odd8k

vs3odd8k1#

您 对 mutliplesOfKLessThanN 的 使用 不 正确

mutliplesOfKLessThanN([3,5] 1000)

中 的 每 一 个
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 告诉 您 的 , 它 期望 一 个 函数 ( 实际 上 是 一 个 特定 类型 的 函数 ) 。
正确 的 写法 应该 是

multiplesOfKLessThanN [3,5] 1000

格式
这 应该 可以 处理 您 所 得到 主要 错误 。

falq053o

falq053o2#

所以这里的错误是类型错误,因为你试图让一个更通用的类型a被函数modulo使用。如果你看类型mod,它期望一个整型类,把你的约束从Num改为Integral应该可以解决你的问题

相关问题