考虑以下
data Predicate = Pred Name Arity Arguments
type Name = String
type Arity = Int
type Arguments = [Entity]
type Entity = String
这将允许创建
Pred "divides" 2 ["1", "2"]
Pred "between" 3 ["2", "1", "3"]
也是“非法”
Pred "divides" 2 ["1"]
Pred "between" 3 ["2", "3"]
“非法”,因为元数与参数列表的长度不匹配。
缺少使用这样的功能
makePred :: Name -> Arity -> Arguments -> Maybe Predicate
makePred n a args | a == length args = Just (Pred n a args)
| otherwise = Nothing
并且只从 Predicate 模块导出 makePred ,有没有办法强制值构造函数的正确性?