【发布时间】:2015-09-15 19:36:58
【问题描述】:
我经常看到带有签名的函数,例如:
let f (lower: int) (upper: int) =
//...
其中lower 和upper 表示函数将要运行的某个范围的上限和下限。此类型签名缺少有关上限和下限是包含还是排除的信息。在美好的一天,这些信息将在文档中......
在我看来,使用类型来表示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 不知道他所描述的概念所使用的名称。不过,合同、约束和改进是有效的概念。如果你愿意的话,你可以说有重复问题