Именованные аргументы конструктора в типе с использованием F # - PullRequest
4 голосов
/ 10 января 2011

Рассмотрим следующий код:

type Test(a) =
  member o.A = a

let test = Test(a = cos 5.)
let test2 = Test(a = 5. |> cos) // ERROR
let test3 = Test(a = (5. |> cos))

Строка Test2 выдает ошибку:

Тип 'bool' не поддерживает никаких операторов с именем 'Cos'

и

Значение или конструктор 'a' не определены

Я понимаю сообщение об ошибке, но мне интересно, не является ли это ошибкой?

Ответы [ 2 ]

5 голосов
/ 10 января 2011

думаю, что все в порядке, поскольку приоритет (|>) меньше, чем (=) выражение

Test(a = 5. |> cos) 

интерпретируется как

Test((a = 5.) |> cos) 

и это сообщение об ошибке правильное

1 голос
/ 10 января 2011

Парсер F # обрабатывает именованные аргументы как выражения проверки равенства; более поздняя стадия компилятора декодирует их в именованные аргументы. Таким образом, это проблема приоритета, описанная @ desco.

Обратите внимание, что если у вас есть логический именованный параметр, вы можете сделать, например,

F(a = true)    // named param
F((a = true))  // compare local name 'a', then pass boolean as first arg

как способ устранения неоднозначности в редких случаях, когда это необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...