#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 # я обнаружил тот факт, что в объявлениях типов вы используете * между элементами, состоящими из кортежей, в то время как в коде вы используете запятую, что сбивает с толку.