Рассмотрим следующее
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
и только экспорт makePred из модуля Predicate, есть ли способ обеспечить правильность конструктора значений?