我对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类似于第一个函数吗?
答案 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,所以没有任何推断。