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

Mar*_*tos 5 haskell

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

例如:

data UInt = UInt Int --the int must be >= 0
Run Code Online (Sandbox Code Playgroud)

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

bhe*_*ilr 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
Run Code Online (Sandbox Code Playgroud)

  • @MarkAnastos它只导出类型,允许其他模块导入它.您必须将其指定为UInt(UInt)或UInt(..)以分别导出特定构造函数或所有构造函数. (2认同)