我突然想到,F# 泛型似乎不接受常量值作为“模板参数”。
假设有人想创建一种类型RangedInt
这样,它的行为类似于 int,但保证只包含整数值的子范围。
一种可能的方法是建立受歧视的工会,类似于:
type RangedInt = | Valid of int | Invalid
但这也不起作用,因为没有“范围信息的类型特定存储”。如果范围不同,2 个 RangedInt 实例也应该是不同的类型。
由于仍然有点 C++ 的影响,它看起来类似于:
template<int low,int high>
class RangedInteger { ... };
现在出现的问题有两个:
- 我是否错过了某些内容并且存在 F# 泛型的常量值?
- 如果我没有错过这一点,那么完成这样的任务的惯用方法是什么?
RangedInt<int,int>
in F#?
发现后Tomas Petricek 关于自定义数字类型的博客 http://tomasp.net/blog/fsharp-custom-numeric.aspx/,相当于我对该博客文章的问题是:如果他没有IntegerZ5
but an IntegerZn<int>
自定义类型家庭?
您请求的语言功能称为依赖类型 https://en.wikipedia.org/wiki/Dependent_type,而 F# 没有这个功能。
它不是一个特别常见的语言特性,甚至 Haskell(大多数其他函数式编程语言“仰慕”的)也没有真正拥有它。
There are存在依赖类型的语言,但我不认为它们是主流。我听到最多的可能是Idris http://www.idris-lang.org.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)