List 在lambda中追加列表

List 在lambda中追加列表,list,lambda,f#,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)])) 有人能解释一下原因,帮我解决这个问题吗 错误显示: 此表达式应具有类型 单位 但是这里有类型 “a list->”a list您的处理程序不应返

这在F#Interactive中起作用:

let (list:(int * int) List) = []
list @ [(40, 60)];;
这在我的程序中是一项重要工作:

let rMouseEvent = 
    form.MouseClick.Add(fun args -> list @ [(args.X, args.Y)]))
有人能解释一下原因,帮我解决这个问题吗

错误显示:
此表达式应具有类型
单位
但是这里有类型

“a list->”a list

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

let rMouseEvent = form.MouseClick.Add(fun args -> list @ [(args.X, args.Y)] |> ignore)
虽然这不是很有用。如果要将项目添加到
列表
,可以将其更改为
大小数组

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

处理程序不应返回值,目前它返回一个
int*int列表
。您可以使用“忽略”忽略它:

let rMouseEvent = form.MouseClick.Add(fun args -> list @ [(args.X, args.Y)] |> ignore)
虽然这不是很有用。如果要将项目添加到
列表
,可以将其更改为
大小数组

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

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

如果您想继续使用列表,请将原始列表放入
ref

let list : (int * int) List ref = ref []
然后做一些类似的事情:

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

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

如果您想继续使用列表,请将原始列表放入
ref

let list : (int * int) List ref = ref []
然后做一些类似的事情:

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

你得到了什么编译错误,或者还有什么失败了?对不起,更新帖子。这是一个编译错误。你确定这就是错误吗[我本以为这更像是抱怨它有
(int*int)list
?它是哪个表达式?Lee的回答中的诊断基本上是正确的。你得到了什么编译错误,或者还有什么失败了?抱歉,更新帖子。这是一个编译错误。你确定这就是错误吗[我本以为这更像是抱怨它有
(int*int)list
?它是哪个表达式?不过,李的答案中的诊断基本上是正确的。为什么没有用呢?与此相比,ResizeArray有什么作用?@PontusMagnusson-它没有用,因为您正在创建一个新列表,并立即丢弃它
@
从两个输入列表创建一个新列表,它不修改任何一个参数列表。如果您想要一个可变列表,请使用
ResizeArray
。为什么它不有用?与此相比,ResizeArray有什么作用?@PontusMagnusson-它没有用,因为您正在创建一个新列表,并立即丢弃它
@
从两个输入列表创建一个新列表,它不修改任何一个参数列表。如果您想要一个可变列表,请使用
ResizeArray