gpt4 book ai didi

f# - 如何从一种以上的记录类型访问相同的标签?

转载 作者:行者123 更新时间:2023-12-01 15:40:21 24 4
gpt4 key购买 nike

是否可以让一个函数从不同的记录类型调用相同的标签?例如假设有两条记录,定义如下

type Pen = {
Diameter: float
InkColor: string
}

type Pencil = {
Diameter: float
Hardness: int
Blackness: int
}

我可以创建一个函数来从任一记录类型访问直径标签吗?现在,如果我定义一支钢笔和铅笔,编译器就会对使用哪种记录类型感到困惑。问题是我不希望编译器选择一种类型,如果它确实选择了某些东西,则允许使用这两种类型。该示例无法编译,因为它需要铅笔。

let black_pen = {
Diameter = 0.7
InkColor = "Black"
}

let mechanical_pencil = {
Diameter = 0.5
Hardness = 1
Blackness = 2
}

let getDiameter writing_utility =
let {Diameter = dia} = writing_utility
dia

printf "%A" (getDiameter black_pen)

我现在看到的唯一选择是:

  1. 将记录与枚举类型结合起来,以判断哪个是什么对象。然后模式匹配
  2. 使用类代替继承
  3. 使用动态类型和反射来检查标签和类型

如果我可以将泛型用于这样的事情,那就太好了:

let getDiameter writing_utility = 
let {Diameter<float> = dia} = writing_utility
dia

只要记录有标签“直径”并且是 float ,它就会返回值。

最佳答案

您确实应该为此使用继承,但以下方法有效

let inline getDiameter (t:^q when ^q :( member Diameter:float)) = 
(^q : (member Diameter:float) t);;

关于f# - 如何从一种以上的记录类型访问相同的标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18093739/

24 4 0