我有一个正常的功能:
z::Int->Int->[Char]
z x y =show(x)++show(y)++show(x*y)
它实际上只是将一些数字转换为字符串的函数。 然后我用快速排序功能快速排序字符串。
quicksort.z 2 3
但在这里我收到了错误
Couldn't match expected type `a0 -> [a1]' with actual type `[Char]'
In the return type of a call of `z'
In the second argument of `(.)', namely `z 2 3'
In the expression: flagskib . z 2 3
我尝试修复括号和使用$函数,但没有帮助。
我很欣赏它上面的任何文字。问题已经解决,所以这篇文章的全部内容都是为了学习。
答案 0 :(得分:9)
quicksort
接受一个论点。 z
需要两个。合成运算符具有以下类型
(.) :: (b -> c) -> (a -> b) -> a -> c
也许你现在可以看到问题。类型不匹配。
quicksort $ z 2 3
会工作吗?因此quicksort . z 2 $ 3
对参数(quicksort . z 2) 3
的应用将返回一个参数的函数,该函数与z
的类型匹配(部分2
应用程序)。
答案 1 :(得分:6)
我假设quicksort
的类型为[a] -> [a]
。
(.)
用于函数组合,因此它需要两个函数组合,但您使用[Char]
代替。你写的内容相当于\x -> quicksort ((z 2 3) x)
,这显然不起作用。
您应该使用($)
代替右关联函数应用程序:quicksort $ z 2 3
,相当于quicksort (z 2 3)
。