2013-10-20 10 views
10

In OCaml, c'è un modo per riferirsi all'operatore cons da solo?OCaml cons (: :) operatore?

Per esempio, posso usare (+) e (*) come int -> int -> int funzioni, ma non posso usare (::) come funzione 'a -> 'a list -> 'a list, come nell'esempio seguente spettacolo:

# (+) 3 5;; 
- : int = 8 
# (*) 4 6;; 
- : int = 24 
# (::) 1 [2;3;4];; 
Error: Syntax error: operator expected. 

C'è un modo per produrre un risultato come (::) diverso da quello con fun x y -> x::y? E qualcuno sa perché (::) non è stato implementato in OCaml?

+0

Funzionerebbe se si circondano gli argomenti con parentesi, in questo modo: '(: :) (1, [2; 3; 4]) ;; ' –

risposta

9

No. Contro (: :) è un costruttore, i costruttori non possono essere operatori infissi. I simboli infissa consentiti sono qui:

http://caml.inria.fr/pub/docs/manual-caml-light/node4.9.html

Alcune soluzioni sono (come si parla) i verbosi

(fun x l -> x :: l) 

e che definiscono le proprie contro infissa non tradizionali

let (+:) x l = x :: l 
+0

Per riferimento, la conoscenza viene introdotta da [http: // caml.inria.fr/pub/docs/manual-ocaml-4.00/expr.html#toc50] Varianti della sezione. – Gqqnbig

13

In aggiunta al risposta di @seanmcl,

In realtà OCaml supporta una forma prefisso (: :):

# (::)(1, []);; 
- : int list = [1] 

Questo è in forma uncurried, corrispondente al fatto che tutti i costruttori varianti OCaml non sono al curry e non possono essere applicati parzialmente. Questo è gestito da una regola di analisi speciale solo per (: :), motivo per cui si ottiene un messaggio di errore piuttosto strano Error: Syntax error: operator expected..

Aggiornamento:

Upcoming OCaml 4.02 elimina questa regola di analisi, quindi questo non è più disponibile.