[英]Defining a new haskell type
我是Haskell的新手。 我有两个问题,但它们有些相关。
是否可以定义一种类型的整数,但不包括特定的整数(例如零)。 或者只是正数。
data allIntsButZero = ..? { a /= 0 | for all a in Int} ??
data positiveInts = ..? { a >= 0 | for all a in Int} ??
简而言之,我可以将一种类型定义为另一种类型的子集吗?
其次,我可以定义施加逻辑的类型吗? 例如
type doublePair = (Int, Int * 2) {- where snd is always 2 times of fst -}
data validDDMMYYYY = G Int Int Int {- where complies to gregorian calendar -}
这些type doublePair
确实没有任何意义。 如果snd
始终是fst
两倍,那么它实际上不包含任何信息! 因此,这种类型肯定更好地表示为
newtype DoubleableInt = DoubleableInt {getDoubleableInt :: Int}
其他的也确实有道理,但是我认为您仍然缺少抽象的意义 。 类型validDDMMYYYY
可能应该表示一个日期 ,即一个时间点。 它是如何respresents这个真的不应该是用户的担忧:如果一个库依赖于一定的代表性,它应该简单地应该提供专门的“智能构造函数”,以确保良好性。 喜欢
newtype AllIntsButZero = AllIntsButZero {getNonzeroInt :: Int}
mkNonzeroInt :: Int -> Maybe AllIntsButZero
mkNonzeroInt 0 = Nothing
mkNonzeroInt n = AllIntsButZero n
然后,您可以拒绝导出AllIntsButZero
构造函数(这将允许用户形成不正确的AllIntsButZero 0
):
module RestrictedNumbers (AllIntsButZero, getNonzeroInt, mkNonzeroInt) where
这样,用户只会将AllIntsButZero
视为“黑匣子”,并且可以与它们一起使用的函数可以保证产生格式正确的值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.