OCaml,多态函数

时间:2018-07-05 19:15:57

标签: function types expression ocaml

我对OCaml没有太多经验。我需要了解多态函数的帮助。

代码:

# let h x y z = if x then y else z val h : bool -> 'a -> 'a -> 'a = <fun>

# let i x y z = if x then y else y val i : bool -> 'a -> 'b -> 'a = <fun>

问题:

您能向我解释为什么第二个函数具有'b作为第二个参数而不是'a类似于第一个函数吗?

2 个答案:

答案 0 :(得分:3)

与表达式中推断出的类型有关。

                        same type since both branches of an `if` expression must be same type
                        ↓      ↓
let h x y z = if x then y else z
                 ↑  
                 must be `bool` since its in the place of a condition

所以我们最终得到

val h : bool -> 'a -> 'a -> 'a
        ↑        ↑     ↑     ↑
        x        y     z     return type
                same type

对于第二个表达式,其相似之处仅是其中一个变量未使用,因此其类型可以是任意值(不受表达式定义中任何规则的约束)。

          unused, could be any type
          |             are the same variable, therefore same type
          ↓             ↓      ↓
let i x y z = if x then y else y
                 ↑  
                 must be `bool` since its in the place of a condition

所以我们最终得到

val h : bool -> 'a -> 'b -> 'a
        ↑        ↑     ↑     ↑
        x        y     z     return type

在这里,'a'b都代表了一些不一定相同的任意类型。例如,'a可以是任何类型,但是所有'a都是相同的类型。 'b也是如此。

'a'b 可以是同一类型,但没有是。第二个表达式中的z类型为b',因为它对类型可以没有任何限制,因此它不必像第一个表达式。

答案 1 :(得分:0)

if的两个分支必须返回相同的类型。考虑一下如果不是内联的话该怎么看:

val if : bool -> 'a -> 'a -> 'a

现在,在第一个示例中,如果ocaml推断出它们是同一类型,则同时使用y和z。在第二个示例中,虽然未使用z,所以没有任何推断。