gpt4 book ai didi

f# 类型成员中静态解析的类型

转载 作者:行者123 更新时间:2023-12-04 08:11:46 26 4
gpt4 key购买 nike

我要实现 IEnumerable<KeyValuePair<DateTime, 'T>>在我自己的类中,并将数学运算符添加到该类中,以便运算符可以像内联函数一样在 'T 的任何数字类型上工作- 自动添加约束。

我只是无法使以下代码工作。在成员声明中使用或不使用 'inline' 关键字都不起作用。

另外,如果我定义一个函数

let inline add l r = l + r 

在类型之前使用它而不是加法 l.Value + r.Value,它也不起作用。

有人可以告诉我我做错了什么吗?

可能整个方法都是错误的,有没有办法以另一种方式实现相同的目标?
namespace Test

open System
open System.Linq
open System.Collections.Generic

[<SerializableAttribute>]
type TimeSeries<'T>(dictionary : IDictionary<DateTime, 'T>) =
let internalList = new SortedList<DateTime, 'T>(dictionary)
interface IEnumerable<KeyValuePair<DateTime, 'T>> with
member this.GetEnumerator() = internalList.GetEnumerator()
member this.GetEnumerator() : Collections.IEnumerator
= internalList.GetEnumerator() :> Collections.IEnumerator
member private this.sl = internalList
static member inline (+) (left : TimeSeries<'T>, right : TimeSeries<'T>) =
let res =
query {
for l in left do
join r in right on
(l.Key = r.Key)
select (l.Key, l.Value + r.Value)
}
new TimeSeries<'T>(res |> dict)

最佳答案

你的方法对我来说似乎是正确的。
您的代码无法编译的原因是 F# 类型推断正在为类型变量 'T 推断静态约束(编译时)。这与用于类型定义的相同。

类型定义的泛型参数不能静态解析(没有“帽子”类型),但没有什么能阻止您定义使用这些编译时约束的函数或成员。

只需更改您的类型变量 'T'U在静态成员中 (+)定义,它会没事的。

您仍然可以创建 TimeSeries不支持的类型实例 (+) (即: TimeSeries<obj> )但您将无法使用 (+)对于这些情况,无论如何,如果您这样做,您将在编译时收到一条很好的错误消息。

关于f# 类型成员中静态解析的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14024742/

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