F # синтаксис запятой в лямбда-выражении

#lambda #syntax #f#

#лямбда #синтаксис #f#

Вопрос:

Я новичок в F #. Может кто-нибудь объяснить, что говорит следующее лямбда-выражение? В частности, что делает запятая после Some c.Id и о чем все скобки?

 (fun ((b, p), c) -> (b amp;amp; p.SelectedInnerRow = Some c.Id, c))
  

Я немного смущен, исходя из C #.

Спасибо.

Ответ №1:

Круглые скобки предназначены для деконструкции кортежей. Лямбда-выражение принимает кортеж (кортеж и некоторое значение) и некоторое другое значение; и он возвращает еще один кортеж.

Теперь для задействованных типов — поскольку аргумент с именем b является операндом логического оператора amp;amp; , он должен иметь тип bool . Аргумент p должен иметь свойство с именем SelectedInnerRow , которое, в свою очередь, должно выдавать параметр. Этот параметр равен равенству по сравнению с другим значением параметра c свойства Id аргумента, поэтому все выражение вернет кортеж из bool и неизмененного аргумента .) c

 (* Dummy types to make it work *)
type Foo = { SelectedInnerRow : int option }
type Bar = { Id : int }

(fun ((b, p), c) -> (b amp;amp; p.SelectedInnerRow = Some c.Id, c))
(* val it : _arg1:(bool * Foo) * c:Bar -> bool * Bar *)
  

Комментарии:

1. Большое вам спасибо. Я забыл, что «=» в F # является оператором сравнения, а не присваиванием. Итак, (..) вокруг «b amp;amp; p.SelectedInnerRow = Some c.Id , c» обозначает это как вывод кортежа?

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

3. @AlanWayne: Да, (a, b) — это кортеж в F #, определяемый запятой. Т.е. в некоторых случаях вы можете написать кортеж без круглых скобок — попробуйте это в REPL, написав «пусть a,b = 1,2». При запуске с F # я обнаружил тот факт, что в объявлениях типов вы используете * между элементами, состоящими из кортежей, в то время как в коде вы используете запятую, что сбивает с толку.