gpt4 book ai didi

interface - 在非泛型 F# 接口(interface)中创建和使用泛型函数

转载 作者:行者123 更新时间:2023-12-04 06:05:16 25 4
gpt4 key购买 nike

在这一点上超出了我的范围。我正在尝试创建一个看起来像这个。

type IFetchData = 
abstract FetchData: string -> seq<'a>

上面的声明是有效的(并且可以编译)但是当我去使用它的时候我得到一个编译时错误。此表达式的类型应为 'a,但此处的类型为“我当前正在尝试返回的内容”,即 seq。

不过,我的示例用法如下所示:

type SampleFetchData() =
interface IFetchData with
member self.FetchData str =
seq {
for letter in str do
yield letter // compile error here
}

我不确定我做错了什么。我想做的就是让接口(interface)实现者能够编写任何返回通用序列的函数 seq<string> , seq<int> , seq<record type here> , seq<union type here>

有人可以告诉我我在这里缺少什么吗?

谢谢。

最佳答案

如果您使用反射加载接口(interface)实现,那么使用它会非常困难。问题是你得到一个 obj 类型的对象.你知道它实现了 IFetchData<'T>对于一些 'T ,但静态地,您不知道为哪个 'T .这是一个问题,因为您无法将对象转换为任何更具体的类型 - 如果您尝试使用 IFetchData<obj> , 它不会工作,因为你不能转换,例如 IFetchData<int>到那种类型。

我建议使用非通用接口(interface),这是非常常见的 .NET 模式:

type IFetchDataUntyped = 
abstract FetchData : string -> System.Collections.IEnumerable

type IFetchData<'T> =
inherit IFetchDataUntyped
abstract FetchData : string -> seq<'T>

当您使用反射加载实现时,您可以将对象转换为 IFetchDataUntyped并以相当合理的方式使用它(如果您知道元素类型,则使用 Seq.cast 将序列转换为更具体的类型)。

根据您的应用,您也可以只制作 FetchData方法泛型方法并保持接口(interface)非泛型。然后您可以将动态加载的对象转换为接口(interface)并调用该方法。然而,这改变了设计(因为该方法必须适用于它作为类型参数获取的任何类型):

type IFetchData =  
abstract FetchData<'T> : string -> seq<'T> // Note: Generic parameter here!

关于interface - 在非泛型 F# 接口(interface)中创建和使用泛型函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8115470/

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