Это связано с типами, которые выводятся в ваших выражениях.
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'
, поскольку не имеет никаких ограничений по типу, поэтому он не обязательно должен быть типа 'a
, как в первом выражении.