F#从返回单位的函数返回一个值

时间:2012-01-02 00:35:35

标签: f# return-type

我有一个类型

type figure =
{
   what : int;
   position : Point;
   size : Point;
}

我希望我的函数返回这个类型,但是因为它是一个事件,它想要返回一个单元() 我怎样才能让我的函数返回这个类型而不是单位?

let checkInput = 
drawArea.MouseClick.Add(fun args -> 
    if args.Button = MouseButtons.Left then 
        new figure { what = 0; position = new Point(args.X, args.Y); size = new Point(50, 50) })

对此有任何帮助将不胜感激

2 个答案:

答案 0 :(得分:1)

在您的示例中,编译器不知道如何处理您创建的新图形。图需要存储在某处或传递给函数。这是一个传递给函数的例子。当您在表单中单击时,标题将更新为单击的位置。

open System.Drawing
open System.Windows.Forms

type Figure = {
   what : int;
   position : Point;
   size : Point;
}

let drawArea = new Form()

let print figure =
    drawArea.Text <- figure.position.ToString()

drawArea.MouseClick.Add(fun args -> 
    if args.Button = MouseButtons.Left then 
        print { what = 0; position = Point(args.X, args.Y); size = Point(50) }
)

Application.Run(drawArea)

对于此示例,您需要在项目的引用下包含这两个程序集。

System.Drawing
System.Windows.Forms

答案 1 :(得分:0)

这听起来像是使用参考单元的完美理由 - 就像这样

let fig = ref None
let checkInput = 
drawArea.MouseClick.Add(fun args -> 
    if args.Button = MouseButtons.Left then 
        fig := Some(new figure { what = 0; position = new Point(args.X, args.Y); size = new Point(50, 50) }))

然后您可以使用

检查参考单元格的值
match !fig with
|Some(t) -> //do something
|None -> //mouse hasn't been clicked