如何对数据类型构造执行检查

时间:2016-05-17 19:26:39

标签: haskell

对于数据类型构造函数,有没有办法限制"对象"的创建? (我不知道正确的术语)基于构造函数参数类型以外的标准吗?

例如:

data UInt = UInt Int --the int must be >= 0

真的,我想为矩形多维列表创建一个数据类型(其中所有子列表具有相同的长度)。一类或其他技术会更适合这个吗?

1 个答案:

答案 0 :(得分:8)

不,没有办法强制用户传递给构造函数的值。

但是,社区和标准库中存在创建智能构造函数的常见做法。您可以在Data.MapData.Ratio等模块中看到这些内容。简而言之,您不会导出构造函数本身,只导出类型,并导出一个审查参数的函数:

module UInt
    ( UInt
    , uint
    ) where

data UInt = UInt Int

uint :: Int -> Maybe UInt
uint x | x >= 0 = Just (UInt x)
       | otherwise = Nothing