2012-03-19 5 views

Respuesta

10

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.

+1

¡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)' –

+0

Sí, lo agregué en una edición justo antes de comentar (no es que necesite obtener el crédito ni nada :-). –

+0

¡Gracias por la explicación! – Ricardo

4

Tenga en cuenta que la distinción entre Foo of (a * b) y Foo of a * b está allí por razones de eficiencia: Foo of (a * b) tiene un argumento que es una tupla, un puntero a dos elementos en el montón. Foo of a * b tiene dos argumentos que están empaquetados directamente con la etiqueta, evitando una indirección.

Ésta es también la razón por la cual, por ejemplo, los algoritmos que utilizan listas de asociación (por ejemplos Hashtables con cubos lista enlazada) a veces definir su propio tipo de datos en lugar de reutilizar ('a * 'b) list:

type ('a, 'b) assoc_list = 
    | Nil 
    | Cons of 'a * 'b * ('a, 'b) assoc_list 

Por supuesto, en general caso de alto nivel, tales especializaciones no son terriblemente importantes (y pueden dificultar la reutilización del código), pero aún así es agradable poder acceder a tales detalles técnicos cuando realmente se necesita un control más estricto sobre la representación de la memoria.

Cuestiones relacionadas