2016-08-17 2 views
0

От чтения:OCaml имена аргументов

Этикетки для аргументов часто совпадают с именами переменных для их. OCaml обеспечивает сокращение для этого случая. Ниже приведены эквивалентны:

let f ~name1:name2 ~name2:name2 = name1+name2 
let f ~name1 ~name2 = name1 + name2 

Когда я кладу в первой строке я получаю эту ошибку

Error: Unbound value name1 
Hint: Did you mean name2? 

Я не понимаю, как они эквивалентны, если первая строка не действительная функция.

+6

Переменная 'name1' в RHS' = 'в вашей первой строке не определена. Я думаю, что это опечатка в ~ name1: name2. Первая строка должна быть разрешена f ~ name1: name1 ~ name2: name2 = name1 + name2 –

+1

Это с http://www.cs.ell.com/courses/cs3110/2015fa/l/02-fun/rec.html , Если у вас есть этот курс, вы должны попросить TA исправить его. – camlspotter

+3

@TrungTa Вы должны опубликовать это как ответ, а не комментарий. – dcorking

ответ

0

syntax of function arguments позволяет использовать разные выражения.

Учитывая выражение expr, которое вычисляется в функцию f, следующий синтаксис разрешено со следующими правилами:

  • expr arg (дается выражение arg): оценить arg до значения v; результат значение f оценивается с аргументом v

  • expr ~lbl (присвоено значение Названныйlbl): только тогда, когда f имеет тип lbl:a -> b для некоторых типов a и b, результатом является значение f ~lbl оценивается с аргументом a; ИЛИ, когда f имеет тип ?lbl:a -> b (а затем lbl должен иметь тип a для проверки типов).

  • expr ~lbl:arg (дается выражением arg): это то же самое, let lbl = arg in exp ~lbl (за исключением того, что порядок оценки expr и arg не определено).

  • expr ?lbl (присваивается значение с именемlbl): только тогда, когда f имеет тип ?lbl:a -> b для некоторых типов a и b, результатом является значение f ~lbl оценивали с аргументом a; lbl должен иметь тип a option для проверки типов. Это чаще всего возникает при пересылке дополнительных аргументов из одной функции в другую.

  • expr ?lbl:arg (дается выражением arg): это то же самое, let lbl = arg in exp ?lbl (за исключением того, что порядок оценки expr и arg не определено).