Function 多态函数

Function 多态函数,function,types,expression,ocaml,Function,Types,Expression,Ocaml,我对OCaml没有太多经验。我需要一些理解多态函数的帮助 代码: #设h x y z=如果x,那么y=z val h:bool->'a->'a->'a= #设i x y z=如果x,那么y,否则y val i:bool->'a->'b->'a= 问题: 你能给我解释一下为什么第二个函数的第二个参数是“b”,而第一个函数的参数不是“a”?这与表达式中推断的类型有关 same type since both branches of an `if` ex

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

代码:

#设h x y z=如果x,那么y=z
val h:bool->'a->'a->'a=

#设i x y z=如果x,那么y,否则y
val i:bool->'a->'b->'a=

问题:


你能给我解释一下为什么第二个函数的第二个参数是“b”,而第一个函数的参数不是“a”?

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

                        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
val h : bool -> 'a -> 'b -> 'a
        ↑        ↑     ↑     ↑
        x        y     z     return type
对于第二个表达式,它的相似之处在于没有使用其中一个变量,因此它的类型可能是任何类型(不受表达式定义中任何规则的约束)

因此,我们以

val h : bool -> 'a -> 'a -> 'a
        ↑        ↑     ↑     ↑
        x        y     z     return type
                same type
val h : bool -> 'a -> 'b -> 'a
        ↑        ↑     ↑     ↑
        x        y     z     return type
这里,
'a
'b
都表示一些不一定相同的任意类型。例如,
'a
可以是任何类型,但所有的
'a
都是相同的类型。这同样适用于
'b


'a
'b
可以是相同的类型,但它们不必是相同的类型<第二个表达式中的code>z是类型
b'
,因为它对它可以是什么类型没有任何限制,因此它不必像第一个表达式中的那样是类型
'a

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

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

现在,在第一个示例中,y和z都用于if so,ocaml推断它们是相同的类型。在第二个示例中,虽然没有使用z,因此没有对其进行任何推断。

第一个函数接受bool和其他两个参数,这些参数必须是相同类型的。这就是
if
表达式的约束。第二个函数未使用其最后一个参数。因此,约束不适用于它。因此,它的类型可能不同于第二个论点的类型。(你应该把这作为一个答案来获得它的业力。)