gpt4 book ai didi

f# - f# 中可区分联合的内置比较

转载 作者:行者123 更新时间:2023-12-01 02:18:37 24 4
gpt4 key购买 nike

在回答 this question , 我发现了 compare 的以下行为关于受歧视的工会。

type T = A | B | C | D 
compare A B (* val it : int = -1 *)
compare A C (* val it : int = -2 *)
compare A D (* val it : int = -3 *)

我对此感到很惊讶。

我可以依靠 compare像这样测量构造函数之间的“距离”?

规范 says (p. 154) 关于生成的 compareTo :

If T is a union type, invoke Microsoft.FSharp.Core.Operators.compare first on the index of the union cases for the two values, and then on each corresponding field pair of x and y for the data carried by the union case. Return the first non-zero result.



从那以后,我希望 compare类型 T总是给一个 -1,0,1既然如此 compare作用于数字类型。 (对?)

最佳答案

规范中的引用说生成的比较将首先比较标签(本质上是构造函数的索引),但我不确定这是否会给您任何有用的信息 - 因为如果联合带有一些值,您将不知道该数字是构造函数之间的距离,还是包含值的比较结果。例如:

type Tricky() = 
interface System.IComparable with
override x.CompareTo(b) = -2

type DU =
| A of Tricky
| B
| C

// Returns -2 because of the distance between constructors
compare (A (Tricky())) C
// Returns -2 because of the comparison on `Tricky` objects
compare (A (Tricky())) (A(Tricky()))

如果您想依靠获取构造函数之间距离的能力,使用枚举可能更安全:
type DU = 
| A = 1
| B = 2
| C = 3

然后您可以通过使用 (int DU.A) - (int DU.C) 将值转换为整数来获得距离。 .

关于f# - f# 中可区分联合的内置比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22417185/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com