这适用于F#Interactive:
let (list:(int * int) List) = []
list @ [(40, 60)];;
我的计划中的这项工作:
let rMouseEvent =
form.MouseClick.Add(fun args -> list @ [(args.X, args.Y)]))
有人可以解释原因,并帮我解决这个问题吗?
错误说:
该表达式预计具有类型
单元
但这里有类型
'列表 - > '列表
答案 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)]))