表示数学区间的类型

Aka*_*ash 3 .net f# types intervals

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

let f (lower: int) (upper: int) =
    //...
Run Code Online (Sandbox Code Playgroud)

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

在我看来,使用类型表示数学区间会更好,因此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
    //..
Run Code Online (Sandbox Code Playgroud)

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

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

Tom*_*cek 6

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

如果您只想为不同类型的区间设置不同的F#类型,可以使用以下内容定义许多简单的数据类型:

module Interval = 
  type InclIncl = InclIncl of int * int
  type InclExcl = InclExcl of int * int
  type InfExcl = InfExcl of int
Run Code Online (Sandbox Code Playgroud)

然后你的每个函数都将采用相应的类型:

let f1 (Interval.InclIncl(a, b)) = 0
let f2 (Interval.InclExcl(a, b)) = 0
let f3 (Interval.InfExcl(a)) = 0
Run Code Online (Sandbox Code Playgroud)

但是,这意味着您无法编写占用任何间隔的函数.因此,在许多情况下,使用表示"间隔"的单一类型实际上可能更有意义,它可以代表所有情况:

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

type Interval = Boundary * Boundary
Run Code Online (Sandbox Code Playgroud)