【问题标题】:Types to represent a mathematical interval [closed]表示数学区间的类型[关闭]
【发布时间】:2015-09-15 19:36:58
【问题描述】:

我经常看到带有签名的函数,例如:

let f (lower: int) (upper: int) =
    //...

其中lowerupper 表示函数将要运行的某个范围的上限和下限。此类型签名缺少有关上限和下限是包含还是排除的信息。在美好的一天,这些信息将在文档中......

在我看来,使用类型来表示mathematical interval 会更好,这样 API 可以指定确切的间隔类型,如果调用者未能提供它,则会出现编译错误。我试过寻找这样的实现,但没有想出任何东西,因此这个问题是为了看看是否有人知道合适的实现。我想要一个可以从 .NET 语言中使用的实现,但我可以从中借鉴想法的其他实现也很有用。

理想情况下,设计应该允许如下所示的函数签名。 { } 包含标准间隔符号中的间隔规范 - 这应该替换为相关类型:

let f1 (interval: { [,] }) = // inclusive lower and upper bounds
    //..

let f2 (interval: { (,) }) = // exclusive lower and upper bounds
    //..

let f3 (interval: { [,) }) = // inclusive lower and exclusive upper bounds
    //..

let f4 (interval: { [∞,) }) = // infinite lower and exclusive upper bounds
    //..

let f5 (interval: { not empty }) = // a non-empty interval
    //..

let f6 (interval: { any interval }) = // accepts any kind of interval
    //..

如果我们认为区间类型在数据类型上应该是泛型的,这个问题就更难了,但是对于初学者,让我们将其限制为适用于单一数据类型的非泛型变体(例如整数或双精度数或日期) .

澄清:我只是想问是否有人知道提供这种实现的库。

【问题讨论】:

  • 道歉。我希望有人可以将我指向提供此类功能的库。我会澄清这个问题。
  • @JohnPalmer 我怀疑你误解了这个问题。这根本不是关于编写代码或寻找库。它是关于定义具有可以由语言/编译器强制执行的值约束的类型。 F#确实有度量单位。 .NET确实有限制。其他语言甚至允许您在声明类型时指定有效值范围
  • 投票结束的人,投票有正当理由。现在票数接近意味着你没能理解一个关于types的问题。这不是工具或对代码的懒惰请求
  • @Akash 检查this similar SO question。您正在寻找 .NET 框架不支持的 refinement types。 C# 没有这样的支持,但您可以使用代码契约来模拟它的一部分。我认为 F# 也没有它们。它与确实具有细化类型的语言有很多共同点,谷歌搜索“F#细化类型”会返回一些研究和 OSS 项目
  • @Carsten 然后建议多加注意。 .记住 SO 的第一条规则,“Be Nice”。即使英语不是他的第一语言,OP 也很有礼貌——这个问题绝对是冗长的。 OP 不知道他所描述的概念所使用的名称。不过,合同、约束和改进有效的概念。如果你愿意的话,你可以说有重复问题

标签: .net types f# intervals


【解决方案1】:

我还没有看到任何 F# 库做这样的事情。我认为这是一个相当复杂的问题,没有明确的答案 - 这在很大程度上取决于您需要对间隔进行什么样的操作(例如,您是否有一些适用于任何间隔的函数?)

如果您只是想为不同类型的间隔使用不同的 F# 类型,您可以使用以下方式定义许多简单的数据类型:

module Interval = 
  type InclIncl = InclIncl of int * int
  type InclExcl = InclExcl of int * int
  type InfExcl = InfExcl of int

那么您的每个函数都会采用相应的类型:

let f1 (Interval.InclIncl(a, b)) = 0
let f2 (Interval.InclExcl(a, b)) = 0
let f3 (Interval.InfExcl(a)) = 0

但是,这意味着您不能编写需要任何间隔的函数。因此,在许多情况下,使用一个表示“区间”的单一类型实际上可能更有意义,它可以代表所有情况:

type Boundary = 
  | Inclusive of int
  | Exclusive of int
  | Unbounded

type Interval = Boundary * Boundary

【讨论】:

  • 我看到 F7 是一个向 F# 添加细化类型的研究项目,尽管它试图做的不仅仅是范围检查。 OP的问题中是否有可以轻松使用的概念/技术?
  • @Tomas 感谢这两个建议,但我真的在寻找将它们结合起来的东西。
  • @PanagiotisKanavos 我没有听说过细化类型,但从我目前所读的少量内容来看,它们似乎更多地是关于约束数值。我不是要求能够在类型系统中指定区间 [-5, 7) - 例如,我只是希望能够指定一个函数将接受 [a, b) 形式的任何区间
猜你喜欢
  • 2016-01-01
  • 2017-01-30
  • 1970-01-01
  • 2011-06-05
  • 2011-10-29
  • 1970-01-01
  • 2021-12-30
  • 2021-01-12
  • 2020-11-28
相关资源
最近更新 更多