Если мы исправим отступ вашего кода, он будет выглядеть так:
let test_func lis =
match lis with h::t ->
match h with h2::t2 ->
h2
| [] ->
[]
| [] ->
[];;
Если вы посмотрите на это, станет очевидно, что нет разницы между первым и вторым | [] -> []
. Таким образом, компилятор не может знать, что вы предполагали, что второй принадлежит внешнему оператору сопоставления, а не внутреннему. Таким образом, вам нужно заключить в скобки, чтобы сообщить компилятору, что внутренний оператор соответствия должен заканчиваться после первого | [] -> []
.
Во второй версии первая | [] -> []
явно принадлежит внешнему оператору соответствия, потому что внутренний оператор поиска даже не появляется до тех пор, пока в программе не будет дальше. Таким образом, нет никакой двусмысленности и, следовательно, нет необходимости в скобках.