为什么我在这个Haskell代码中得到“无法匹配期望的类型”?

时间:2012-04-22 19:16:15

标签: haskell

我有一个正常的功能:

      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

我尝试修复括号和使用$函数,但没有帮助。

我很欣赏它上面的任何文字。问题已经解决,所以这篇文章的全部内容都是为了学习。

2 个答案:

答案 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)