2015-08-20 11 views
6

PerchéPerché questi incarichi producono risultati diversi?

let ab a b = a 5 + b 

produrrà

val ab : a:(int -> int) -> b:int -> int 

e

let ab2 a b = a 5 +b 

produrrà

val ab2 : a:(int -> int -> 'a) -> b:int -> 'a 

Perché questo uno spazio tra '+' e 'b' rende questo differenza?

+6

Nell'espressione '+ b',' + 'viene interpretato come un [operatore unario] (https://en.wikipedia.org/wiki/Unary_operation) (prendendo solo' b' come argomento). – Glorfindel

risposta

10

Dipende tutto da come il parser dà la priorità a diverse opzioni sintattiche per evitare l'ambiguità.

+ è sia l'operatore di addizione binaria che l'operatore unario "positivo" . 5 + b è quindi l'applicazione di aggiunta a due argomenti; ma +b è l'operatore positivo applicato a qualche simbolo b.

Così

let ab a b = a 5 + b 

viene analizzato come:

let ab a b = (a 5) + b 

con a essendo funzione di un argomento intero restituendo un int in modo che possa essere aggiunto al b; ma

let ab2 a b = a 5 +b 

viene analizzato come:

let ab2 a b = a (5) (+b) 

con a essendo una funzione di due argomenti, senza la possibilità di dedurre il tipo ritorna.

Non ho a disposizione un elenco di operatori F #, quindi non posso controllare il nome corretto. Modifica: sembra che non ricordassi correttamente: Arithmetic Operators (F#) :-).

Problemi correlati