表示数学区间的类型

时间:2015-06-29 11:02:13

标签: .net types f# intervals

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

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
    //..

如果我们认为区间类型在数据类型上应该是通用的,那么这个问题就更难了,但是对于初学者来说,让我们将它限制为一个适用于单一数据类型的非泛型变体(例如int或者双打或约会)。

澄清:我只是问是否有人知道提供此类实施的库。

1 个答案:

答案 0 :(得分:6)

我没有看到任何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