F # сокращение для вызова метода на объекте в лямбде - PullRequest
5 голосов
/ 29 сентября 2010

Я думаю, что это в некоторой степени связано с этим вопросом , но я не уверен, и поскольку здесь нет реального ответа, я иду:в Scala вы можете написать такой код:

aStringArray.map(_.toUpperCase())

, что сокращенно для:

aStringArray.map(s => s.toUpperCase())

Есть ли что-то подобное в F # или способ его реализации (без?оператор или интенсивное использование отражения)?Если это невозможно, будет ли это рассматриваться как языковая функция для будущей версии?(Я действительно многословен в функциях просто для вызова метода на объекте в замыкании!).

Ответы [ 4 ]

6 голосов
/ 29 сентября 2010

Как указывает Дарио, такая функция, как синтаксис _.Foo() в Scala, в настоящее время недоступна в F #, поэтому вам придется явно написать лямбда-функцию, используя fun a -> a.Foo().

Насколько я знаю, такой вопрос время от времени появляется в обсуждениях F #, поэтому он, несомненно, рассматривался командой F #.Это немного сложно (например, хотите ли вы разрешить только использование элементов или другое использование, например, _ + 10, и какова будет область действия лямбда-выражения?) Кроме того, значение функции является относительно низким по сравнению с другими вещами, которыеможно было бы сделать ... В любом случае, было бы неплохо иметь его!

Это также может быть причиной того, что многие типы F # представляют операции как члены (используемые в стиле ОО), так и функции в модуле (за функциональный стиль).Я думаю, что вы могли бы рассмотреть это как хорошую практику F # (но это зависит от ваших предпочтений дизайна).Например:

type Foo(a:int) = 
  member x.Add(b:int) = a + b

// Attribute allows you to define module with the same name
[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
module Foo = 
  let add b (v:Foo) = v.Add(b)

Затем вы можете использовать fun v -> v.Add(10) и Foo.add 10 для создания значения функции.К сожалению, тип String не имеет соответствующего модуля со всеми функциями в основных библиотеках F #, поэтому вам придется написать его самостоятельно.

5 голосов
/ 29 сентября 2010

Просто используйте fun s -> s.ToUpper() в качестве параметра, который создает ту же анонимную функцию, что и Scala.

Обратите внимание, что этот хитрый _ трюк из Scala (в настоящее время) не существует в F #, но если вы не вызывали объектный метод, вы могли бы просто использовать частичную оценку, как в

filter ((=) 42) list
1 голос
/ 29 сентября 2010

См. Эту ветку форума:

http://cs.hubfs.net/forums/permalink/13313/13319/ShowThread.aspx#13319

Команда F # неоднократно бывала на этой территории, но из нее ничего не вышло.На данный момент я думаю, что вряд ли мы введем новую синтаксическую форму, которая сохраняет менее 10 символов.

0 голосов
/ 29 сентября 2010

Это не совсем тот ответ, который вы хотели, но в настоящее время я работаю над этим, создавая фиктивные статические функции (если мне понадобится одна и та же вещь несколько раз), так как это красивее, чем лямбда-синтаксис: *

let toupper (s:string) = s.ToUpper()
aStringArray.map toupper
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...