Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# Array2D在GetHashCode()中是否存在错误?_F# - Fatal编程技术网

F# Array2D在GetHashCode()中是否存在错误?

F# Array2D在GetHashCode()中是否存在错误?,f#,F#,如果在F#中复制一维数组,则两个实例的哈希代码相同。 如果对Array2D的实例也这样做,似乎情况并非如此 下面的代码是一个Xunit单元测试函数,展示了潜在的问题 [<Fact>] member this.``test if Array2D has a problem with hash codes`` () = let a0 = Array2D.init 4 4 ( fun x y -> x * 10 + y ) let a0hc = a0.GetHashC

如果在F#中复制一维数组,则两个实例的哈希代码相同。 如果对Array2D的实例也这样做,似乎情况并非如此

下面的代码是一个Xunit单元测试函数,展示了潜在的问题

[<Fact>]
member this.``test if Array2D has a problem with hash codes`` () =
    let a0 = Array2D.init 4 4 ( fun x y -> x * 10 + y )
    let a0hc = a0.GetHashCode()
    let a1 = Array2D.copy a0
    let a1hc0 = a1.GetHashCode()
    Assert.Equal(a0hc,a1hc0)  // fails!
    a1.[0,0] <- 42
    let a1hc1 = a1.GetHashCode()
    Assert.NotEqual(a1hc0,a1hc1)
    a1.[0,0] <- 0
    let a1hc2 = a1.GetHashCode()
    Assert.Equal(a1hc0,a1hc2)
[]
成员:``测试Array2D是否有哈希代码问题``()=
设a0=Array2D.init4(乐趣x y->x*10+y)
设a0hc=a0.GetHashCode()
设a1=Array2D.copy a0
设a1hc0=a1.GetHashCode()
Assert.Equal(a0hc,a1hc0)//失败!

a1.[0,0]您可能需要查看

一种通用散列函数,用于返回相同的散列值 根据
=
运算符相等的项


其他.NET集合(如array和generic)也是如此。即使“两个相等的对象返回相等的散列码”,它显然没有将两个内容相同的不同数组视为相等的对象。这种奇怪的现象是人们喜欢函数式编程的部分原因,函数式编程往往具有结构平等性。我认为你对一维数组具有相同哈希代码的说法是不对的。看起来(=)运算符对它们进行了结构比较,但它们有不同的哈希代码。我在interactive(1D数组案例)中测试了它,它似乎适用于我的测试数组
[|0..3 |]
。它也没有为fsi中的1D数组提供相同的哈希代码,你看小提琴了吗?@KennethIto确实是对的-它似乎也适用于1D数组:`[]请记住这个。
测试一维数组是否有哈希代码问题
(x:int[])=(Array.copy x)。GetHashCode()=x.GetHashCode()``回答很好-我完全错过了
哈希
功能。同时我做的是覆盖记录上的
GetHashCode()
Equals()
,我的数组在。同时设置一些属性:
[]
let one = Array2D.create 1 1 0
let two = Array2D.create 1 1 0

printfn "%b" (one.Equals two)                           // false
printfn "%b" (one = two)                                // true
printfn "%b" (one.GetHashCode() = two.GetHashCode())    // false
printfn "%b" (hash one = hash two)                      // true