Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 没有F“带常数的泛型”;模板参数";?_F# - Fatal编程技术网

F# 没有F“带常数的泛型”;模板参数";?

F# 没有F“带常数的泛型”;模板参数";?,f#,F#,我刚刚想到,F#泛型似乎不接受常量值作为“模板参数” 假设有人想创建一个类型RangedInt,它的行为类似于int,但保证只包含整数值的子范围 一种可能的办法是建立一个歧视性的联盟,类似于: type RangedInt = | Valid of int | Invalid template<int low,int high> class RangedInteger { ... }; 但这也不起作用,因为并没有“范围信息的特定类型存储”。如果范围也不同,则2个RangedInt

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

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

一种可能的办法是建立一个歧视性的联盟,类似于:

type RangedInt = | Valid of int | Invalid
template<int low,int high>
class RangedInteger { ... };
但这也不起作用,因为并没有“范围信息的特定类型存储”。如果范围也不同,则2个RangedInt实例应为不同的类型

仍然有点C++感染,它看起来和

相似。
type RangedInt = | Valid of int | Invalid
template<int low,int high>
class RangedInteger { ... };
模板
类范围整数{…};
现在出现的问题有两个:

  • 我是否遗漏了一些东西和F#泛型的常量值
  • 如果我没有错过这一点,那么用F#实现这样一个
    RangedInt
    的惯用方法是什么
  • 找到了,与我在那篇博客文章中的问题相当的是:如果他不是一个
    IntegerZ5
    而是一个
    IntegerZn
    自定义类型的家族会怎么样

    我是否遗漏了一些东西和F#泛型的常量值

    虽然F#比其他.NET语言具有更强的类型推断能力,但它的核心是基于.NET的

    和.NET泛型只支持C++模板中可能的一小部分。泛型类型的所有类型参数都必须是类型,并且类型参数也没有默认值

    如果我没有错过这一点,那么用F#实现这种射程力的惯用方法是什么

    这将取决于细节。在运行时设置限制是一种可能性–这将是.NET中常用的方法。另一个是度量单位(这似乎不太可能是合适的)

    如果他不是一个
    IntegerZ5
    而是一个
    IntegerZn
    自定义类型的族呢

    我认为有两个原因:

    • 这是一个例子,避免泛型可以使事情变得更简单,从而使重点放在例子的要点上
    • 您还会使用什么其他底层类型?在当代系统上,较小的类型(
      byte
      Int16
      等)效率较低(除非运行时的空间是最重要的考虑因素)
      long
      会增加大小,但不会带来任何好处(它只会容纳5个可能的值)

      • 您请求的语言功能被调用,而F#没有该功能

        它不是一个特别常见的语言特性,甚至Haskell(大多数其他函数式编程语言都很喜欢)也没有它


        有一些有依赖类型的语言,但没有一个我会考虑主流。可能我听到的最多的是。

        是的,远离泛型也让文章避开了我问题中的问题:)换句话说,
        IntegerZn
        是指
        IntegerZn
        的意思,而不是“使用哪种基类型”在运行时设置值不是一个选项,因为我试图实现的是让类型系统在编译时捕获bug。事实上,我昨天花了一段时间研究依赖类型,发现了一个名为ATS的ML变异(但无法运行)。它的思想是在编译时有一种结合逻辑编程和求解器的语言,这样人们就可以为他们的代码编写证明——在用它验证代码后,在编译时删除这些证明。我的F#想法基本上是:使用现代主流语言,我能朝这个方向走多远?