我想尝试并比较F#的lambda函数是否相等。乍一看,这似乎是不可能的。
let foo = 10
let la = (fun x y -> x + y + foo)
let lb = (fun x y -> x + y + foo)
printfn "lambda equals %b" (la = lb)
产生错误的部分
类型'('a -> 'b -> int)'不支持'相等性'约束,因为它是一个函数类型F#编译器(1)
然而,令人惊讶的是,序列化lambda函数是可能的。
open System.Runtime.Serialization.Formatters.Binary
open System.IO
let serialize o =
let bf = BinaryFormatter()
use ms = new MemoryStream()
bf.Serialize(ms,o)
ms.ToArray()
let ByteToHex bytes =
bytes
|> Array.map (fun (x : byte) -> System.String.Format("{0:X2}", x))
|> String.concat System.String.Empty
let foo = 10
let la = (fun x y -> x + y + foo)
let lb = (fun x y -> x + y + foo)
let a = serialize la
let b = serialize lb
printfn "%s" (ByteToHex a)
printfn "%s" (ByteToHex b)
printfn "lambda equals %b" (a = b)
这表明如果它们可以串行化,就可以进行比较。然而,对于这个示例的字节流的检查显示出现了两个不同的字节。
有没有可能通过智能比较字节数组来解决这个问题呢?
fun x y -> x + y
和fun x y -> y + x
相等? - Mark Pattison