F # возвращает значение из функции, которая возвращает единицу - PullRequest
0 голосов
/ 02 января 2012

У меня есть тип

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 ]

1 голос
/ 02 января 2012

В вашем примере компилятор не знает, что делать с новой созданной вами фигурой.Рисунок должен быть где-то сохранен или передан функции.Вот пример, где это передается функции.Когда вы щелкаете в форме, заголовок обновляется до позиции, на которую вы щелкнули.

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
0 голосов
/ 02 января 2012

Это звучит как идеальная причина для использования эталонной ячейки - например,

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
...