【问题标题】:Extend type in F#F# 中的扩展类型
【发布时间】:2020-06-28 02:46:30
【问题描述】:

假设我有一些类型

type A = { ... }

type B = { ... }

type AB = A of A | B of B

type Ainfo = { 
    a: A
    ... 
}

type Binfo = { 
    b: B
    ... 
}

type ABinfo = Ainfo of Ainfo | Binfo of Binfo

我需要一个集合来存储这些类型的附加信息

类似Dictionary<AB, ABinfo>

这个字典的问题是它允许将 A 的键与 Binfo 的值相关联。

有没有一种好的方法来构造代码,让 A 总是用 Ainfo 扩展而 B 总是用 Binfo 扩展?在 OOP 中,我会从 A 继承 Ainfo,从 B 继承 Binfo,但不确定如何在 F# 中以最佳方式做到这一点

【问题讨论】:

  • 只列出ABinfo 怎么样? AinfoBinfo 已经分别具有 AB 的值,因此您不需要以字典键的形式复制它们。这种重复就是不一致的来源。
  • 或两个字典,问题不是真正的 OOP 与 FP,字典允许 1 类型的键映射到 1 类型的值。
  • @FyodorSoikin 我想通过 AB 快速找到 ABinfo,列表我必须迭代。
  • 好的,在这种情况下,您能否描述一下您将如何通过 OOP 和继承来避免这个问题?从我的立场来看,只要您坚持使用字典,您就会遇到完全相同的问题。

标签: f#


【解决方案1】:

从您的 cmets 中,我了解到您确实想要两个属性:

  1. 通过构造有效 - 即不可能将 A-value 与 B-key 关联
  2. 恒定时间查找(例如Dictionary 优惠)

要解决这两个属性,您可以在后台使用 两个 字典而不是一个。一个字典将包含A-values,另一个 - B-values:

type ABDict = { aDict: Dictionary<A, Ainfo>; bDict: Dictionary<B, Binfo> }

let newABDict () = { aDict = Dictionary(); bDict = Dictionary() }

let insert abinfo dict =
    match abinfo with
    | Ainfo ainfo -> dict.aDict.Add(ainfo.a, ainfo)
    | Binfo binfo -> dict.bDict.Add(binfo.b, binfo)

let lookup ab dict = 
    match ab with
    | A a -> 
        let found, ainfo = dict.aDict.TryGetValue(a)
        if found then Some (Ainfo ainfo) else None
    | B b -> 
        let found, binfo = dict.bDict.TryGetValue(b)
        if found then Some (Binfo binfo) else None

// Usage:
let d = newABDict ()
insert (Ainfo { a = { ... }, ... }) d
insert (Binfo { b = { ... }, ... }) d

let x = lookup (A { ... }) d
let y = lookup (B { ... }) d

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    • 2013-03-27
    • 2014-06-11
    • 1970-01-01
    相关资源
    最近更新 更多