我有一个函数可以简单地切换任何给定函数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的类型符号吗?
答案 0 :(得分:9)
以下内容可能有所帮助:
flippingArguments :: (t -> t1 -> t2) -> t1 -> t -> t2
flippingArguments f a b = f b a
我们知道第一个参数f
的类型为(t -> t1 -> t2)
,即它是一个二进制函数,它接受类型为t
和t1
的两个参数,并返回一个类型的值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,它接受输入a
和b
,并产生预期的结果。
尽管语法不同,但此变体与第一个实现之间没有区别。实际上,由于 currying ,一个函数接受三个参数f,a,b
并返回一个类型t2
的值,一个函数只接受一个参数{{1并返回类型为f
的函数值。