【问题标题】:Difference between an F# function name and a function value pointed at that nameF# 函数名称和指向该名称的函数值之间的区别
【发布时间】:2019-03-13 02:38:45
【问题描述】:

我在 WPF / FsXaml 应用程序中使用以下代码 sn-p:

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 静态扩展只适用于第二个?我会(错误地?)认为它们是同一个东西。

【问题讨论】:

  • 如果有人对更好的标题有建议,我会欢迎。
  • 以我危险的 F# 知识量,我很惊讶这完全有效。为什么这不会导致无限递归(错误)?您不是用|&gt; GroupSelectedgroupSelected 指向自身吗?
  • @MarkusDeibel 除非我遗漏了什么,否则GroupSelected 之前 let groupSelected 必须有第二个定义(它必须接受string 而不是@987654335 @)。要指向它自己,它必须是let rec groupSelected(e) ... and GroupSelected = groupSelected
  • @MarkusDeibel 对不起。我的代码 sn-p 不清楚。我也有一个名为 GroupSelected 的 DU。但这与我的问题无关。我已经更新了代码 sn-p。

标签: f# fsxaml


【解决方案1】:

这是由于生活在 .NET 框架世界中而使简单的功能性想法变得更加复杂的领域之一。 F# 确实以两种不同的方式编译您的 groupSelectedGroupSelected

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; }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-31
    • 2016-05-26
    • 2013-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多