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

use*_*939 2 haskell types

我有一个函数,它只是为任何给定的函数f切换两个参数的顺序,如下所示:

flippingArguments f a b = f b a
Run Code Online (Sandbox Code Playgroud)

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

flippingArguments :: (t -> t1 -> t2) -> t1 -> t -> t2
Run Code Online (Sandbox Code Playgroud)

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

flippingArguments :: (t -> t1 -> t2) -> t -> t2 -> t1
Run Code Online (Sandbox Code Playgroud)

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

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

chi*_*chi 9

以下可能会有所帮助:

flippingArguments :: (t -> t1 -> t2) -> t1 -> t -> t2
flippingArguments    f                  a     b  = f b a
Run Code Online (Sandbox Code Playgroud)

我们的第一个参数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
Run Code Online (Sandbox Code Playgroud)

在这里,我们只有一个参数f,与上面的类型相同.其结果是λ,它作为输入ab,并产生预期的结果.

尽管语法不同,但此变体与第一个实现之间没有区别.实际上,由于currying,在获取三个参数的函数f,a,b和返回类型的值之间没有区别t2,并且函数只接受一个参数f并返回类型的函数值t1->t->t2.