Gostaria de ajuda para entender como a inferência de tipo afeta o código a seguir, que vem de uma pergunta anterior (que, após algumas reflexões, simplifiquei para o seguinte):
type 'a result =
| Succ of 'a
| Fail
let first f = function
| Succ c -> let res = f c in Succ res
| fail -> fail
let second f = function
| Succ c -> let res = f c in Succ res
| Fail -> Fail
Minha pergunta é: por que f
in first
have type ('a -> 'a)
mas f
in second
have type ('a -> 'b)
?
Você pode vê-lo aqui .
Fail
in são tratadas como dois valores distintos e, portantoFail -> Fail
,second
podem ter tipos diferentes'a result
e'b result
, masfail
in são tratadas como o mesmo valor e, portanto, não podem alterar os tiposfail -> fail
.first
Ou pelo menos o sistema de inferência de tipos não permite alterar tipos. Não tenho certeza se isso é uma especificação ou uma peculiaridade desse intérprete específico.
Como alimento para reflexão, uma terceira versão:
Você e eu sabemos que se chegarmos ao
_
caso do pattern-match, significa quer
éFail
e pode ser de qualquer'b result
tipo, mas o que o compilador vê é que ér
do tipo'a result
já que é a entrada, e assim por diante'a == 'b
.