对于数据类型构造函数,有没有办法限制"对象"的创建? (我不知道正确的术语)基于构造函数参数类型以外的标准吗?
例如:
data UInt = UInt Int --the int must be >= 0
真的,我想为矩形多维列表创建一个数据类型(其中所有子列表具有相同的长度)。一类或其他技术会更适合这个吗?
答案 0 :(得分:8)
不,没有办法强制用户传递给构造函数的值。
但是,社区和标准库中存在创建智能构造函数的常见做法。您可以在Data.Map
,Data.Ratio
等模块中看到这些内容。简而言之,您不会导出构造函数本身,只导出类型,并导出一个审查参数的函数:
module UInt
( UInt
, uint
) where
data UInt = UInt Int
uint :: Int -> Maybe UInt
uint x | x >= 0 = Just (UInt x)
| otherwise = Nothing