gpt4 book ai didi

.net - F# - 如何使用 get_Zero 扩展类型,以便可以通用地使用现有类型?

转载 作者:行者123 更新时间:2023-12-04 14:57:08 24 4
gpt4 key购买 nike

我尝试以下操作:

let c x = System.Numerics.Complex(x, 0.0)
let sum = [c 1.0; c 2.0] |> List.sum

但我收到此错误:
The type 'System.Numerics.Complex' does not support the operator 'get_Zero'
我阅读了关于类型扩展的规则,来自 https://msdn.microsoft.com/en-us/library/dd233211.aspx ,并尝试执行以下操作:
module ComplexExtension =
let c x = System.Numerics.Complex(x, 0.0)

type System.Numerics.Complex with
// I also tried a bunch of other ways of writing these
// as static or instance members, but nothing worked
static member Zero = c 0.0
static member One = c 1.0

open ComplexExtension

let sum = [c 1.0; c 2.0] |> List.sum

我仍然收到那个错误。

是否可以使用 get_Zero 运算符扩展类型?或者我必须在 System.Numerics.Complex 周围创建我自己的包装器类型吗?如果我想让它做复数做的其他事情,并覆盖所有的运算符?

最佳答案

List.sum使用静态成员约束。静态成员约束不考虑扩展方法,因此这不是一个选项。

包装整个复杂类型是一种选择,但它是矫枉过正的,如果它只是一个特定的调用,你有很多方法可以通过更多的击键来计算总和,你可以使用 fold如另一个答案所示。或者,您可以使用 List.reduce (+)如果您确定该列表将始终至少包含一个元素。

这可能会在 future 版本的 F# 中得到修复,但问题是静态成员约束不适用于字段,除非它们有 getter。然而,在 F# 库中,他们可以“模拟”现有类型的那些成员,they do it normally with primitive types否则它不适用于 int , float ,因为他们也没有那个成员。

我不确定 Complex 是否是事实在 System.Numerics 中定义是不以这种方式实现它的原因,或者他们可能只是忘记了它。在任何情况下,您都可以打开问题或提交拉取请求以修复它。

最后,如果您仍想以通用方式使用它,另一种选择是重新定义 sum功能。例如 sum来自最新 source 的函数(这里是 F#+ )版本可以正常工作(它有同样的问题,但很容易修复,实际上它是一个错误)几乎所有的数字类型,包括 Complex和大多数第三方数字类型,因为它具有回退机制,当类型没有 get_Zero 时,该机制依赖于某些转换。成员。

关于.net - F# - 如何使用 get_Zero 扩展类型,以便可以通用地使用现有类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33403433/

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