在lambda中附加列表

时间:2014-01-12 15:55:08

标签: list lambda f#

这适用于F#Interactive:

let (list:(int * int) List) = []
list @ [(40, 60)];;

我的计划中的这项工作:

let rMouseEvent = 
    form.MouseClick.Add(fun args -> list @ [(args.X, args.Y)]))

有人可以解释原因,并帮我解决这个问题吗?

错误说:
该表达式预计具有类型
  单元
但这里有类型
  '列表 - > '列表

2 个答案:

答案 0 :(得分:2)

您的处理程序不应返回值,目前它返回int * int list。您可以使用ignore忽略它:

let rMouseEvent = form.MouseClick.Add(fun args -> list @ [(args.X, args.Y)] |> ignore)

虽然这不是很有用。如果您要将项目添加到list,则可以将其更改为ResizeArray

let r = new ResizeArray<int * int>()
let rMouseEvent = form.MouseClick.Add(fun args -> r.Add((args.X, args.Y)))

或者你可以使用ref:

let (r: (int*int) list ref) = ref []
let rMouseEvent = form.MouseClick.Add(fun args -> r := !r @ [(args.X, args.Y)])

答案 1 :(得分:2)

你得到的编译错误表明事件处理程序应该返回unit - 即根本没有值 - 但是你试图返回(int * int) list。预期的返回类型表示调用者不会为您返回值,因此您需要存储自己更改的任何值。

如果您想坚持使用列表,请将原始列表设为ref

let list : (int * int) List ref = ref []

然后执行以下操作:

let rMouseEvent = 
    form.MouseClick.Add(fun args -> list := !list @ [(args.X, args.Y)]))