2015-08-20 4 views
6

ПочемуПочему эти присвоения дают разные результаты?

let ab a b = a 5 + b 

будет производить

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

и

let ab2 a b = a 5 +b 

будет производить

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

Почему это один пробел между '+' и 'б' делает это разница?

+6

В выражении '+ b' символ' + 'интерпретируется как [унарный оператор] (https://en.wikipedia.org/wiki/Unary_operation) (принимающий только' b' в качестве аргумента). – Glorfindel

ответ

10

Все дело в том, как синтаксический анализатор уделяет приоритетное внимание различным синтаксическим параметрам, чтобы избежать двусмысленности.

+ является и двоичным оператором сложения, и унарным «положительным» Оператор 1. Таким образом, 5 + b является дополнением к двум аргументам; но +b - положительный оператор, применяемый к некоторому символу b.

Так

let ab a b = a 5 + b 

анализируется как:

let ab a b = (a 5) + b 

с a является функцией одного целого аргумента, возвращающего Int поэтому он может быть добавлен к b; но

let ab2 a b = a 5 +b 

обрабатывается как:

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

с a является функцией двух аргументов, не имея возможности определить тип он возвращается.

У меня нет списка операторов F #, поэтому вы не можете проверить правильное имя. Изменить: похоже, я не мог правильно запомнить: Arithmetic Operators (F#) :-).

Смежные вопросы