considerar los siguientesinvariantes Especificación de los constructores de datos
data Predicate = Pred Name Arity Arguments
type Name = String
type Arity = Int
type Arguments = [Entity]
type Entity = String
Esto permitiría la creación de
Pred "divides" 2 ["1", "2"]
Pred "between" 3 ["2", "1", "3"]
sino también la "ilegal"
Pred "divides" 2 ["1"]
Pred "between" 3 ["2", "3"]
"ilegal" porque la aridad no coincide con la longitud de la lista de argumentos.
corto de utilizar una función como esta
makePred :: Name -> Arity -> Arguments -> Maybe Predicate
makePred n a args | a == length args = Just (Pred n a args)
| otherwise = Nothing
y sólo exportar makePred desde el módulo de predicados, ¿hay una manera de hacer cumplir la corrección del valor del constructor?
No en el sistema de tipos. Necesitarías uno de los (incluso) más lujosos (tipos dependientes? Solo adivinando aquí, no soy realmente el mejor póster). – delnan
Los tipos dependientes de hecho permiten una solución. –
Probablemente puedas obtener algo con un truco con "naturales de nivel de tipo", pero esa no es realmente una buena solución. –