gpt4 book ai didi

f# - 我可以在 F# 成员函数上指定函数类型吗?

转载 作者:行者123 更新时间:2023-12-02 04:17:15 24 4
gpt4 key购买 nike

我目前正在尝试使用 Eto.Forms来自 F#。我遇到的一个小烦恼是,当您在外部文件(XAML 或 JSON)中定义 GUI 对象(表单、面板、按钮等)并声明事件处理程序时,这些事件处理程序必须具有特定类型:

member public this.OnFirstButtonClicked (sender:Object, e:EventArgs) ->
MessageBox.Show(this, "First button was clicked")
|> ignore
member public this.OnSecondButtonClicked (sender:Object, e:EventArgs) ->
MessageBox.Show(this, "Second button was clicked")
|> ignore

类型签名的重复让我很困扰。 (这两个函数实际上有很多重复,比如用几乎没有变化的参数调用 MessageBox,但这只是一个测试项目。在真实的项目中,我会对这两个按钮做一些不同的事情。)不想每次都重复每个函数的类型签名。看完this page at F Sharp For Fun and Profit ,我想我可以做这样的事情:

type EventHandler = (Object * EventArgs) -> unit

member public this.OnFirstButtonClicked : EventHandler ->
MessageBox.Show(this, "First button was clicked")
|> ignore
member public this.OnSecondButtonClicked : EventHandler ->
MessageBox.Show(this, "Second button was clicked")
|> ignore

但是,当我尝试此操作时,我发现在成员函数上,该语法实际上意味着“此函数返回一个 EventHandler 函数”。我想说“这个成员函数一个EventHandler函数”,但我不知道该怎么做。

更新:自从编写上述问题以来,我了解到实际上不必指定事件处理函数参数的类型签名。以下内容将起作用:

member public this.OnFirstButtonClicked (sender, e) ->
MessageBox.Show(this, "First button was clicked")
|> ignore
member public this.OnSecondButtonClicked (sender, e) ->
MessageBox.Show(this, "Second button was clicked")
|> ignore

但是,我真正的问题不是“如何使这些事件处理程序正常工作?”我真正的问题是,“我已经学会了如何指定不是类成员的函数的类型,但是如何为 一个类的成员?”

最佳答案

独立函数定义和方法定义之间的唯一区别是 member 关键字和自标识符。除此之外,语法是相同的。

再次检查 F# for fun and profit 上的示例

type AdditionFunction = int->int->int
let f:AdditionFunction = fun a b -> a + b

它实际上是一个值绑定(bind),而不是一个函数绑定(bind)。该函数使用 lambda 表达式 fun a b -> a + b 定义,并绑定(bind)到标识符 f。

要使用这种定义,您必须将事件处理程序定义为

type EventHandler = (Object * EventArgs) -> unit

member public this.OnFirstButtonClicked : EventHandler =
fun (_, _) ->
MessageBox.Show(this, "First button was clicked")
|> ignore

同样,它的工作原理与独立函数完全相同。

关于f# - 我可以在 F# 成员函数上指定函数类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32899729/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com