此多态函数使我们可以翻转任意咖喱函数的参数顺序:
# let flip f x y = f y x ;;
val flip : ('a -> 'b -> 'c) -> 'b -> 'a -> 'c
即flip
接受类型为'a->'b->'c的函数,并返回类型为b->'a->'c的函数。但是我实际上不明白,为什么它是正确的? a,b,c的顺序如何确定?对此很困惑,任何人都可以为我解释一下,谢谢。
答案 0 :(得分:3)
让我们考虑所有给定变量的类型。如果我们有f : 'a -> 'b -> 'c
,则根据函数定义中的代码f y x
,我们有y : 'a
和x : 'b
。同样,flip
的返回类型(即flip f x y
的类型)也是f y x
的类型,因此'c
。
函数flip
依次具有三个参数f
,x
和y
。并且它返回值f y x
。因此,flip
的类型为:
flip : ('a -> 'b -> 'c) -> 'b -> 'a -> 'c
---------------- -- -- --
| | | |_ The type of the return value, (f y x)
| | |_ The type of y
| |_ The type of x
|_ The type of f
答案 1 :(得分:1)
也许这可能对您有帮助。代替
let flip f x y = f y x ;;
写下等效定义,
let flip f = fun x y -> f y x;;
现在查看类型
val flip : ('a -> 'b -> 'c) -> 'b -> 'a -> 'c
与此相同,但带有括号
val flip : ('a -> 'b -> 'c) -> ('b -> 'a -> 'c)
函数flip
接受类型为f
的函数'a -> 'b -> 'c
并返回类型为\fun x y -> f y x
的函数'b -> 'a -> 'c
。