Function 多态函数
我对OCaml没有太多经验。我需要一些理解多态函数的帮助 代码: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
#设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
表达式的约束。第二个函数未使用其最后一个参数。因此,约束不适用于它。因此,它的类型可能不同于第二个论点的类型。(你应该把这作为一个答案来获得它的业力。)