gpt4 book ai didi

haskell - 限制类型构造函数中的值

转载 作者:行者123 更新时间:2023-12-03 14:42:59 26 4
gpt4 key购买 nike

这个问题在这里已经有了答案:




10年前关闭。




Possible Duplicate:
How to create a type bounded within a certain range



我有数据类型:
data Expr = Num Int
| Expression Expr Operator Expr

在问题的上下文中, (Num Int) 的数字将仅代表单个数字。有没有办法确保类型声明中的限制?

当然我们可以定义一个函数来测试 Expr是有效的,但最好让类型系统处理它。

最佳答案

您可以使用带有 smart constructor 的抽象数据类型。 :

newtype Digit = Digit { digitVal :: Int }
deriving (Eq, Ord, Show)

mkDigit :: Int -> Maybe Digit
mkDigit n
| n >= 0 && n < 10 = Just (Digit n)
| otherwise = Nothing

如果你把它放在另一个模块中并且不导出 Digit构造函数,则客户端代码无法构造 Digit 类型的值超出范围 [0,9],但您必须手动包装和打开它才能使用它。你可以定义一个 Num进行模运算的实例,如果有帮助的话;这也可以让你使用数字文字来构造数字。 (对于 EnumBounded 也是如此。)

但是,这并不能确保您永远不会尝试创建无效的 Digit,只是您永远不会这样做。如果您想要更多的保证,那么 Jan 提供的手动解决方案会更好,但代价是不那么方便。 (如果你为那个 Digit 类型定义了一个 Num 实例,它最终会像“不安全”一样,因为你可以写 42 :: Digit 多亏了你得到的数字文字支持。)

(如果你不知道 newtype 是什么,它基本上是 data 用于具有单个严格字段的​​数据类型;围绕 T 的新类型包装器将具有与 T 相同的运行时表示。它基本上只是一个优化,所以为了理解这一点,你可以假装它说 data。)

编辑:有关更面向理论的 100% 解决方案,请参阅此答案的相当狭窄的评论部分。

关于haskell - 限制类型构造函数中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8510570/

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