如何制作代表数字子集的数据结构?

Ero*_*roc 6 types elm

我想知道是否有一种方法可以使像Int类型这样的东西只能代表数字的某个子集(例如0〜29),并且如果您尝试对它进行其他操作,则会使编译器抛出错误。

我知道我可以做类似的事情,type MoonPhaseDay = Day1|Day2| ... |Day29但这不会扩大范围。

我正在尝试牢记“使不可能的状态无法代表”的建议。我可以和一起解决,Int但我很好奇是否有更好的方法。

Rob*_*ell 4

您正在寻找的内容有时被称为“依赖类型”,并且现在不属于 Elm 的一部分。

但是,您可以通过在其自己的模块中创建类型来获得类似的东西,而不是导出原始类型构造函数,而是仅导出您提供的自定义函数(使其成为“不透明类型”)。这样,该模块就包含唯一需要保护的代码。


Nathan 的这个回答在学习不透明类型时可能会有所帮助。

  • +1我想补充一点,“不透明类型”,即不导出类型构造函数,而是执行一些约束检查的函数,也称为智能构造函数。这可能有助于进一步搜索该主题。 (3认同)