没有带有常量"模板参数"的F#泛型?

Bit*_*ler 6 f#

我刚刚想到,F#泛型似乎不接受常量值作为"模板参数".

假设有人想创建一个类型RangedInt,它的行为类似于int,但保证只包含一个整数值的子范围.

可能的方法可能是受歧视的联盟,类似于:

type RangedInt = | Valid of int | Invalid
Run Code Online (Sandbox Code Playgroud)

但这也不起作用,因为没有"范围信息的类型特定存储".如果范围不同,2个RangedInt实例应该是不同类型的.

仍然有点C++出没,它看起来类似于:

template<int low,int high>
class RangedInteger { ... };
Run Code Online (Sandbox Code Playgroud)

现在问题出现了两个问题:

  1. 我是否错过了F#泛型存在的东西和常数值?
  2. 如果我没有错过,那么RangedInt<int,int>在F#中实现这样一个惯用的方法是什么?

找到Tomas Petricek关于自定义数字类型的博客,相当于我对该博客文章的问题将是:如果他不是IntegerZ5一个IntegerZn<int>自定义类型系列怎么办?

Mar*_*ann 7

您请求的语言功能称为从属类型,而F#没有该功能.

它不是一个特别常见的语言功能,甚至Haskell(其他大多数函数式编程语言都很擅长)都没有它.

有相关类型语言在那里,但他们没有我会考虑的主流.可能我听到的最多的是伊德里斯.