gpt4 book ai didi

generics - 相互定义的参数中的 F# 通用单位

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

在定义一个运算符时,我在使用 F# 测量单位时遇到了问题,该运算符的参数具有根据另一个参数的通用测量单位定义的通用测量单位。例如:

type Quotient<[<Measure>]'b> =
| Divisible of int64<'b>
| Remaindered of int64<'b> * int64<'b>

let (|/) (x: int64<'a>) (y: int64<'a/'b>) =
let q = x / y
if q * y = x then Divisible q else Remaindered (q, x - (q * y))

在这里,y定义于 <'a/'b> ,其中<'a>单位是x 。我期待 (|/) 的类型成为int64<'a> -> int64<'a/'b> -> Quotient<'b> ,但是编译器告诉我类型是 x:int64<'b> -> y:int64 -> Quotient<'b> .

我想用它来进行十进制数字不可能的类型转换。我的目标是创建用于处理商的运算符,而不是在每个类型转换中放置计算余数的逻辑。是否有可能实现这个目标,或者我应该以不同的方式进行类型转换?

最佳答案

有趣的问题。如果您取出 'a/'b 并将其替换为 'b,您会发现编译器突然向您发出关于 -< 的警告 运算符。

它告诉您减法左侧和右侧的单位必须相同,因此将 'b 限制为 1。为什么?

x 的单位为 'a

q 的单位为 'b

这告诉您,您的商实际上需要两个测量参数。

type Quotient<[<Measure>]'a, [<Measure>]'b> =
|Divisible of int64<'a>
|Remaindered of int64<'a> * int64<'b>

这是有道理的,因为任何余数都将采用原始单位。

let (|/) (x: int64<'a>) (y: int64<'a/'b>) : Quotient<'b,'a>  =
let q = x / y
if q * y = x then Divisible q else Remaindered (q, x - q * y)

关于generics - 相互定义的参数中的 F# 通用单位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35951358/

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