Esta es una de las partes problemáticas de la sintaxis OCaml, en mi opinión. A pesar de la forma en que se ve, el constructor Foo no requiere una tupla 2 como argumento. Requiere, sintácticamente, dos valores entre paréntesis, pero no son una tupla. Entonces, simplemente es el caso que t
tiene el tipo incorrecto. La manera de hacer que esto funcione es decir:
let (a, b) = t in Foo (a, b)
El problema realmente es que los paréntesis se utilizan para dos cosas diferentes (o al menos eso dicen). Una vez que te acostumbras a esto, no es tan difícil de tratar.
Editar: si desea el constructor Foo tomar una sola tupla, en lugar de dos valores distintos, se puede definir así:
type foo = Foo of (int * int)
A continuación, el resto de su código original se trabajo.
¡Los paréntesis se utilizan para más de dos cosas! También hacen que el ejemplo del OP funcione como está si solo cambia 'tipo foo = Foo de (int * int)' –
Sí, lo agregué en una edición justo antes de comentar (no es que necesite obtener el crédito ni nada :-). –
¡Gracias por la explicación! – Ricardo