Разница между именем функции F # и значением функции, указанным на это имя - PullRequest
3 голосов
/ 13 марта 2019

Я использую следующий фрагмент кода в приложении WPF / FsXaml:

let groupSelected(e: SelectionChangedEventArgs) =
    e.AddedItems
    |> Seq.cast<string>
    |> Seq.head
    |> SelectedGroupChanged

let GroupSelected = groupSelected

При наведении указателя мыши на groupSelected Visual Studio показывает следующее:

val groupSelected: e:SelectionChangedEventArgs -> ClientGroupEvent

Это немного отличается для GroupSelected:

val GroupSelected: (SelectionChangedEventArgs -> ClientGroupEvent)

Я уже замечал эту разницу ранее в других контекстах и ​​никогда не думал об этом.Если я хочу вызвать один из них, синтаксис в моем коде такой же ... groupSelected(e) и GroupSelected(e) оба компилируются нормально.

Однако, когда я пытаюсь использовать эти два из XAML, только это работает:

{x:Static local:EventConverters.GroupSelected}

Это не работает:

{x:Static local:EventConverters.groupSelected}

В чем разница между этими двумя, так что расширение XAML Static работает только со вторым?Я бы (по ошибке?) Подумал, что это одно и то же.

1 Ответ

4 голосов
/ 13 марта 2019

Это одна из областей, где простые функциональные идеи немного усложняются благодаря жизни в мире .NET Framework. F # действительно компилирует ваши groupSelected и GroupSelected двумя различными способами.

IntelliSense говорит вам об этом. В большинстве случаев это не то, о чем вам нужно беспокоиться, и вполне разумно рассматривать следующие два как одно и то же (и, насколько это касается самого F #, они есть):

val groupSelected: e:SelectionChangedEventArgs -> ClientGroupEvent
val GroupSelected: (SelectionChangedEventArgs -> ClientGroupEvent)

Ключевое различие заключается в том, что они будут скомпилированы по-разному. Первый - как метод, а второй - как свойство, которое возвращает значение функции. Использование нотации C #:

// groupSelected is compiled as a method:
ClientGroupEvent groupSelected(SelectionChangedEventArgs e);

// GroupSelected is compiled as a property:
FSharpFunc<SelectionChangedEventArgs, ClientGroupEvent> GroupSelected { get; }
...