2

我有一个工作正常的功能:

      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

我尝试了诸如括号之类的修复和使用 $ 函数,但没有帮助。

我很欣赏关于它的任何话。问题已经解决了,所以这篇文章的全部意义就是学习。

4

2 回答 2

9

quicksort接受一个论点。z需要两个。组合运算符具有以下类型

(.) :: (b -> c) -> (a -> b) -> a -> c

也许您现在可以看到问题所在。类型不匹配。

quicksort $ z 2 3

将工作。所以会quicksort . z 2 $ 3或类似地(quicksort . z 2) 3因为对z参数的应用2返回一个参数的函数,它与(.)(部分应用)的类型匹配。

于 2012-04-22T19:23:29.317 回答
6

我假设quicksort有 type [a] -> [a](.)用于函数组合,因此它期望组合两个函数,但您使用 a[Char]代替。你写的相当于\x -> quicksort ((z 2 3) x),这显然行不通。您应该改用($)右关联函数 application: quicksort $ z 2 3,相当于quicksort (z 2 3).

于 2012-04-22T19:26:46.607 回答