1

我正在尝试在 F# 中制作一个非常简单的应用程序。我只想用点击事件制作一个小按钮,它将调用该MessageBox.Show()方法。

open System
open System.Windows.Forms

module FSI =
    [<System.Runtime.InteropServices.DllImport("user32.dll")>]
    extern bool ShowWindow(nativeint hWnd, int flags)
    let HideConsole() = 
        let proc = System.Diagnostics.Process.GetCurrentProcess()
        ShowWindow(proc.MainWindowHandle, 0)

FSI.HideConsole()

let form1 = new Form()
form1.Text <- "App"

let Test() = ( MessageBox.Show("Clicked.") )

let button1 = new Button( Text = "Click Me" )
button1.Click.AddHandler(fun _ _ -> Test())

form1.Controls.Add(button1)    

[<STAThread>]
do
   Application.Run(form1)

发生以下错误:

  • FSI.HideConsole() // 警告
  • button1.Click.AddHandler(fun _ _ -> Test()) // 编译错误

它们是相似的。

对于第一个:

  • 警告这个表达式应该有“unit”类型,但有“bool”类型。使用 'ignore' 丢弃表达式的结果,或使用 'let' 将结果绑定到名称。

对于第 2 次:

  • 此表达式应具有单元类型,但此处具有 DialogResult 类型
4

1 回答 1

1

F# 函数隐式返回其最后一个表达式的结果,因此目前您的函数 Test() 返回MessageBox.Show(string). 要创建返回 void/unit 的函数,您可以使用忽略运算符。

let Test() = ignore (MessageBox.Show("Clicked."))

必须进行额外的括号包装有点麻烦,因此通常使用 pipeforward ( |>) 运算符,它不需要:-

let Test() = MessageBox.Show("Clicked.") |> ignore

这也可以应用于您对 HideConsole 的调用。编译器使用警告通知您未使用 HideConsole 的返回值。

于 2013-07-21T13:48:02.727 回答