切换参数顺序的函数的类型是什么?

时间:2016-12-19 13:17:39

标签: haskell types

我有一个函数可以简单地切换任何给定函数f的两个参数的顺序,如下所示:

flippingArguments f a b = f b a

当我用:t检查flippingArguments的类型时,我得到以下内容:

flippingArguments :: (t -> t1 -> t2) -> t1 -> t -> t2

我不明白。我会预测以下(这是错误的):

flippingArguments :: (t -> t1 -> t2) -> t -> t2 -> t1

也许我误解了如何在Haskell中读取类型规范?我理解的方式是第一个括号(t - > t1 - > t2)表示flippingArguments参数,其中t是f,t1是a,t2是b,以下三个t - > t2 - > t1是flippingArguments返回值,其中只是翻转了t1和t2的顺序。但这是错误的。

我来自Java,请原谅我,如果我不明白这里的返回值是什么,它可能是非常基本的东西。重申一下,有人可以向我解释flippingArguments的类型符号吗?

1 个答案:

答案 0 :(得分:9)

以下内容可能有所帮助:

flippingArguments :: (t -> t1 -> t2) -> t1 -> t -> t2
flippingArguments    f                  a     b  = f b a

我们知道第一个参数f的类型为(t -> t1 -> t2),即它是一个二进制函数,它接受类型为tt1的两个参数,并返回一个类型的值t2

然后,第二个参数a的类型为t1

然后,第三个参数b的类型为t

最后,flippingArguments f a b的结果属于t2类型。

更明显的实施可能是:

flippingArguments :: (t -> t1 -> t2) -> (t1 -> t -> t2)
flippingArguments    f               =  \a     b -> f b a

这里我们知道只有一个参数f,其类型与上面相同。结果是一个lambda,它接受输入ab,并产生预期的结果。

尽管语法不同,但此变体与第一个实现之间没有区别。实际上,由于 currying ,一个函数接受三个参数f,a,b并返回一个类型t2的值,一个函数只接受一个参数{{1并返回类型为f的函数值。