gpt4 book ai didi

f# - 如何创建实现 IDictionary <'K, ' V> 和 IEnumerable<'V> 的类型

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

我想创建一个实现 IDictionary<'K, 'V> 和 IEnumerable<'V> 的只读键控集合。采取明显的方法,我得到以下错误:
This type implements or inherits the same interface at different generic instantiations 'IEnumerable<'V>' and 'IEnumerable<KeyValuePair<'K,'V>>'. This is not permitted in this version of F#.
有没有不同的方法来实现这一点?

编辑 - 既然这似乎是 F# 的一个不可逾越的限制,那么实现这一点的惯用方法是什么?想到的一个想法是提供返回所需数据 View 的成员,例如成员 x.List : IList<'V> 和成员 x.Dict : IDictionary<'K, 'V>。对象表达式可用于提供实现。还有其他想法吗?

最佳答案

一种相对简单的方法是将两个接口(interface)的实现公开为您正在编写的类型的成员。这可以使用对象表达式很好地完成,或者只需编写一段代码来构造某种类型并将其作为结果返回。第二种方法如下所示:

type MyCollection<'K, 'V when 'K : equality>(keys:list<'K>, values:list<'V>) = //'
member x.Dictionary =
Seq.zip keys values |> dict
member x.Enumerable =
values |> List.toSeq

第一种方法(如果您想直接实现接口(interface)的方法,大致如下所示:
type MyCollection<'K, 'V when 'K : equality>(keys:list<'K>, values:list<'V>) = //'
member x.Dictionary =
{ new IDictionary<'K, 'V> with
member d.Add(k, v) = ... }
member x.Enumerable =
// Similarly for IEnumerable
values |> List.toSeq

将实现作为 kvb 提到的模块中的函数公开也是一个不错的选择 - 我认为许多标准 F# 库类型实际上都执行了这两个选项(以便用户可以选择他/她喜欢的样式)。可以这样添加:
module MyCollection = 
let toDict (a:MyCollection<_, _>) = a.Dictionary

关于f# - 如何创建实现 IDictionary <'K, ' V> 和 IEnumerable<'V> 的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3311283/

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