将包括列表在内的多个参数传递给函数
这就是我想要发生的事情:
[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 那样更改,它也喜欢更改错误消息?
回答
您的使用mutliplesOfKLessThanN不正确
mutliplesOfKLessThanN([3,5] 1000)
不被 Haskell 解释为
mutliplesOfKLessThanN用[3,5]和申请1000。
但它被解释为
适用
[3,5]于1000并适用multiplesOfKLessThanN于结果。
我认为您的误解在于函数应用程序是如何发生的。在许多语言中,函数应用程序需要括号,例如f(x). 对于 Haskell 来说,括号只表示先做这个操作,函数应用是通过把东西放在一起来实现的。Sof(x)在 Haskell 中有效,因为它与 相同f x,但f(x y)与 相同,f(x(y))并告诉 Haskell 先求值x y,然后将其交给f.
你的代码 Haskell 不能[3,5]作为函数应用,这就是 Haskell 告诉你的,它期望一个函数(实际上是一个特定类型的函数)。
写这个的正确方法是
multiplesOfKLessThanN [3,5] 1000
这应该处理您遇到的主要错误。