2012-03-19 12 views

risposta

10

Questa è una delle parti problematiche della sintassi OCaml, secondo me. Nonostante il suo aspetto, il costruttore Foo non richiede una tupla di 2 come argomento. Richiede, sintatticamente, due valori tra parentesi - ma non sono una tupla. Quindi è semplicemente il caso che t ha il tipo sbagliato. Il modo di fare questo lavoro è quello di dire:

let (a, b) = t in Foo (a, b) 

Il problema è davvero che le parentesi sono utilizzate per due cose diverse (o almeno così mi dicono). Una volta che ci si abitua a questo non è così difficile da affrontare.

Edit: se si desidera il costruttore Foo di prendere una singola tupla, piuttosto che due valori distinti, è possibile definire in questo modo:

type foo = Foo of (int * int) 

Poi il resto del codice originale sarà lavoro.

+1

Le parentesi sono utilizzate per più di due cose! Fanno anche l'esempio dell'OP come-è se cambia solo 'type foo = Foo of (int * int)' –

+0

Sì, ho aggiunto questo in una modifica appena prima di commentare (non che ho bisogno di ottenere il credito o qualcosa :-). –

+0

Grazie per la spiegazione! – Ricardo

4

nota che la distinzione tra Foo of (a * b) e Foo of a * b c'è per ragioni di efficienza: Foo of (a * b) ha un argomento che è una tupla, un puntatore a due elementi mucchio. Foo of a * b ha due argomenti che sono direttamente impacchettati con il tag, evitando un riferimento indiretto.

Questo è anche il motivo per cui, ad esempio, gli algoritmi che usano liste associative (per gli esempi Hashtables con secchi lista collegata) a volte definire il proprio tipo di dati, invece di riutilizzare ('a * 'b) list:

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

Naturalmente, in generale casi di alto livello tali specializzazioni non sono terribilmente importanti (e possono ostacolare il riutilizzo del codice), ma è comunque bello essere in grado di scendere a tali dettagli tecnici quando è effettivamente necessario un controllo più stretto sulla rappresentazione della memoria.

Problemi correlati