【问题标题】:Extend parameter type in F#在 F# 中扩展参数类型
【发布时间】:2020-10-19 03:17:49
【问题描述】:

假设我有一些类型

type A = { ... }

type B = { ... }

type AB = A of A | B of B

type Ainfo = { //some additional information about A
    ... 
}

type Binfo = { //some additional information about B
    ... 
}

type ABinfo = Ainfo of Ainfo | Binfo of Binfo

并且有一个函数适用于这些类型 - 它接受可以是 A 或 B 的“实体”以及有关该实体的一些附加信息。

let myFunc (entity: AB) (info: ABinfo) = ...

如何执行编译器限制以避免使用实体 A 和信息 Binfo 调用“myFunc”,反之亦然?

PS这个问题与我的另一个问题Extend type in F#

有关

【问题讨论】:

  • 如果您尝试将ABinfo 一起传递会发生什么?我知道你会说“它不应该编译”,但是我的下一个问题是:如果你甚至不知道在编写程序时传递了什么怎么办?例如,假设函数的两个参数最终来自用户输入。在这种情况下,在用户输入它们之前,您无法知道它们将是什么。那么如果用户输入了错误的组合会发生什么?
  • @FyodorSoikin 在这种情况下会有例外
  • 好吧,如果你对异常没问题,那么只需让你的函数检查输入是否匹配,如果不匹配则抛出异常。

标签: functional-programming f#


【解决方案1】:

你的问题太笼统了。我怀疑它是XY problem 的一个实例。你有一些具体的情况,你的问题假设能够强制执行这种编译器限制会给你答案。没有简单的方法可以做到这一点,我怀疑您的实际问题的答案是您需要以不同的方式设计您的类型。但是,如果不了解更多关于您的实际场景以及类型代表什么,就无法说出具体情况。

如果你真的想编写一个函数,它只能使用AAInfoBBInfo,那么你可以通过定义一个新的可区分联合类型来做到这一点:

type ABplus = 
  | AwithInfo of A * Ainfo
  | BwithInfo of B * Binfo

let myFunc ab = 
  match ab with
  | AwithInfo(a, ainfo) -> ...
  | BwithInfo(b, Binfo) -> ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-11
    • 2012-07-24
    • 1970-01-01
    相关资源
    最近更新 更多