gpt4 book ai didi

types - 如何制作表示数字子集的数据结构?

转载 作者:行者123 更新时间:2023-12-04 15:17:17 25 4
gpt4 key购买 nike

我想知道是否有办法制作像 Int 这样的东西只能表示某个数字子集(如 0 ~ 29)的类型,如果您尝试对它执行任何其他操作,编译器会抛出错误。

我知道我可以这样做 type MoonPhaseDay = Day1|Day2| ... |Day29但这并不能在更大的范围内扩展。

我试图牢记建议,“使不可能的状态无法代表”。我可以使用 Int但我很好奇是否有更好的方法。

最佳答案

您需要使用智能构造函数。您通过控制从模块导出的内容来强制执行您的约束。

module Bounded exposing (Bounded, fromInt, toInt)


type Bounded
= Bounded Int


fromInt : Int -> Maybe Bounded
fromInt n =
if n < 0 || n > 29 then
Nothing
else
Just (Bounded n)


toInt : Bounded -> Int
toInt (Bounded n) = n

解释
Bounded type 被定义为具有一个数据构造函数的联合类型。导出类型时,我们不导出构造函数,即它不是公共(public) API 的一部分。这被称为 不透明类型 .

该模块的用户只能创建 Bounded使用 fromInt 的类型. fromInt被称为 智能构造器因为它有一些逻辑(智能)来执行约束。

如果您需要使用它包装的整数,请使用 toInt . toInt保证总是返回一个介于 0 和 29 之间的整数。没有隐藏的后门可以允许包装任何其他整数。

HaskellWiki 在 smart constructors 上有一篇不错的文章。 .

最后,Richard Feldman 在他的演讲“镀金玫瑰的类型和测试”中介绍了一个很好的例子 here这准确地解释了你想要做什么。

关于types - 如何制作表示数字子集的数据结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56812185/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com