gpt4 book ai didi

f# - 与 fsharp 中的相等运算符比较

转载 作者:行者123 更新时间:2023-12-02 09:30:00 25 4
gpt4 key购买 nike

如果我有下一个类型:

type Color(r: float, g: float, b:float) =
member this.r = r
member this.g = g
member this.b = b
static member ( * ) (c1:Color, c2:Color) =
Color (c1.r*c2.r, c1.g*c2.g, c1.b*c2.b)

static member Zero = Color(0.0,0.0,0.0)

我这样做:

let ca = Color(1.,1.,1.)
let cb = Color(1.,1.,1.)
ca = cb

我应该获得 true,但是通过脚本进行的 F# 交互却给我 false相反,如果我定义为:

let ca = Color(1.,1.,1.)
let cb = ca
ca = cb

它返回尝试以这种方式比较已定义类型的两个值时,我做错了什么吗?我怎样才能得到 true 结果?

谢谢

最佳答案

Color 的 OP 定义是一个。默认情况下,类具有引用相等性,就像在 C# 中一样。这意味着它们只有在字面上是相同的对象(指向相同的内存地址)时才相等。

只有 F# 中的函数式数据类型具有结构相等性。这些包括记录、可区分联合、列表和一些其他类型。

Color 定义为一条记录会更符合习惯:

type Color = { Red : float; Green : float; Blue : float }

此类型内置了结构相等性:

> let ca = { Red = 1.; Green = 1.; Blue = 1. };;

val ca : Color = {Red = 1.0;
Green = 1.0;
Blue = 1.0;}

> let cb = { Red = 1.; Green = 1.; Blue = 1. };;

val cb : Color = {Red = 1.0;
Green = 1.0;
Blue = 1.0;}

> ca = cb;;
val it : bool = true

如果你想为类型定义乘法和零,你也可以这样做:

let (*) x y = {
Red = x.Red * y.Red
Green = x.Green * y.Green
Blue = x.Blue * y.Blue }

let zero = { Red = 0.0; Green = 0.0; Blue = 0.0 }

这使您能够编写,例如:

> let product = ca * cb;;

val product : Color = {Red = 1.0;
Green = 1.0;
Blue = 1.0;}

关于f# - 与 fsharp 中的相等运算符比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34229552/

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