2012-07-03 13 views
5

Perché il tipo di plus (+) è considerato come int -> int -> int rispetto a (int * int) -> int? Per me, il secondo ha senso perché "accetta" una tupla da 2 (gli addendi) e restituisce un singolo int (la loro somma).Tipo OCaml dell'operatore più

Grazie!

risposta

11

È possibile creare una lingua in cui (+) ha il tipo (int * int) -> int. In effetti, SML funziona esattamente in questo modo. Influisce solo sul significato degli operatori infissi. Tuttavia le convenzioni OCaml favoriscono fortemente l'uso di funzioni curry (del tipo a -> b -> c) piuttosto che di quelle non corrette. Un buon risultato è che puoi applicarli parzialmente. Ad esempio ((+) 7) è un'espressione significativa di tipo int -> int. Trovo questa notazione utile abbastanza spesso.

+1

Puoi spiegare con ((+) 7) è di tipo int-> int? Mi sta confondendo. Come va da int a int? –

+1

La risposta breve è che è una funzione che aggiunge 7 a qualsiasi cosa tu gli dai. È equivalente a 'fun x -> x + 7'. Per una risposta più lunga, posso modificare la mia risposta sopra se lo desideri. –

+0

@JeffreyScofield: beh, tecnicamente, è equivalente a 'fun x -> 7 + x', ma qui è la stessa cosa – newacct

2

Questo potrebbe sembrare un po 'inutile, ma è perché la funzione accetta due argomenti.

Quando una funzione accetta una tupla, in effetti utilizza un singolo argomento.

Poiché (+) è una funzione inline, l'utilizzo di un singolo argomento non sarebbe utile, in quanto apparirebbe come + (1,2) anziché 1 + 2.