在F#中,如何将函数转换为其他委托?

时间:2011-07-07 19:30:33

标签: f# delegates

我需要将带有签名Thing -> Thing -> int的函数转换为Comparison<Thing>

例如,当我有:

Array.Sort(values, mySort)

我收到错误声明“此表达式预计会有类型比较,但此处的类型为Thing - &gt; Thing - &gt; int

当我尝试这个时:

Array.Sort(values, (fun (a, b) -> mySort a b))

(实际上,这是通过包装器对象)

我收到错误消息“类型约束不匹配。类型'' - &gt;'b'与”比较“类型不兼容”

我应该如何提供Comparison<T>

仅供参考:Comparison<T>是具有签名'T * 'T -> int

的代表

2 个答案:

答案 0 :(得分:2)

这对我有用:

let values = [|1;2;3|]
let mySort a b = 0
Array.Sort(values, mySort)

但你试过了吗?

Array.Sort(values, Comparison(mySort))

答案 1 :(得分:0)

奇怪的是,尽管代表签名以tupled形式表示(例如'T * 'T -> int),但您需要以curry形式提供您的功能(例如fun a b -> mySort a b)。请参阅规范的section 6.4.2