Haskell中合并排序中的编译错误
我在Haskell中编写合并排序,它给出了一个奇怪的错误:Haskell中合并排序中的编译错误,haskell,mergesort,Haskell,Mergesort,我在Haskell中编写合并排序,它给出了一个奇怪的错误: Couldn't match expected type '[a0] -> Int' with actual type '[Int]' 代码是: f :: [Int] -> [Int] f l |length l == 1 = l |length l == 2 = if head l > last l then reverse l else l |otherwise = myappend (
Couldn't match expected type '[a0] -> Int' with actual type '[Int]'
代码是:
f :: [Int] -> [Int]
f l
|length l == 1 = l
|length l == 2 = if head l > last l then reverse l else l
|otherwise = myappend ( take ( div length l 2 ) l ) ( drop ( div length l 2 ) l )
myappend :: [Int] -> [Int] -> [Int]
myappend l [] = l
myappend [] l = l
myappend ( x : xs ) (y : ys) = if x > y then y : x : myappend xs ys else x : y : myappend ys xs
您的问题在于
div length L2
部分。这里给出了div
3个参数:length
,l
和2。相反,您应该编写div(length l)2
您的问题在于div length l2
部分。这里给出了div
3个参数:length
,l
和2。相反,您应该编写div(length l)2
谢谢。有人能告诉我哈斯克尔如何阅读一份声明吗?我的指导老师告诉我,函数运算具有最高的优先级。它有。但也要记住,函数是数据。因此,只有当函数是运算符后的第一个单词时,函数应用才会发生。最后,看看这本书。它将使您快速了解Haskell。是的,它是左关联的,因此div length L2
实际上是((div length)l)2
。谢谢。有人能告诉我哈斯克尔如何阅读一份声明吗?我的指导老师告诉我,函数运算具有最高的优先级。它有。但也要记住,函数是数据。因此,只有当函数是运算符后的第一个单词时,函数应用才会发生。最后,看看这本书。它将使您快速了解Haskell。是的,它是左关联的,因此div length L2
实际上是((div length)l)2
。您的算法被破坏了,而您的myappend
是错误的。考虑合并<代码> [1,2,5] < /代码>和<代码> [3,4] < /代码>。另外,下次请完整显示您的错误消息。我已经修复了它。我无法用一些数据检查我的程序,因为它没有编译。谢谢你的建议。你的算法坏了,你的myappend
错了。考虑合并<代码> [1,2,5] < /代码>和<代码> [3,4] < /代码>。另外,下次请完整显示您的错误消息。我已经修复了它。我无法用一些数据检查我的程序,因为它没有编译。谢谢你的建议。