OCaml中的参数多态性问题

时间:2018-12-14 06:52:41

标签: ocaml parametric-polymorphism

此多态函数使我们可以翻转任意咖喱函数的参数顺序:

 # 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的顺序如何确定?对此很困惑,任何人都可以为我解释一下,谢谢。

2 个答案:

答案 0 :(得分:3)

让我们考虑所有给定变量的类型。如果我们有f : 'a -> 'b -> 'c,则根据函数定义中的代码f y x,我们有y : 'ax : 'b。同样,flip的返回类型(即flip f x y的类型)也是f y x的类型,因此'c

函数flip依次具有三个参数fxy。并且它返回值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