Si consideri il seguenteSpecifica invarianti sui costruttori di valore
data Predicate = Pred Name Arity Arguments
type Name = String
type Arity = Int
type Arguments = [Entity]
type Entity = String
Ciò consentirebbe la creazione di
Pred "divides" 2 ["1", "2"]
Pred "between" 3 ["2", "1", "3"]
ma anche la "illegale"
Pred "divides" 2 ["1"]
Pred "between" 3 ["2", "3"]
"illegale", perché l'arity non corrisponde alla lunghezza dell'elenco di argomenti.
Breve di utilizzare una funzione come questa
makePred :: Name -> Arity -> Arguments -> Maybe Predicate
makePred n a args | a == length args = Just (Pred n a args)
| otherwise = Nothing
e solo l'esportazione makePred dal modulo predicato, c'è un modo per far rispettare la correttezza del costruttore di valore?
Non nel sistema di tipi. Avresti bisogno di uno di quelli (anche) più fantasiosi (tipi dipendenti?) Solo indovinando qui, non sono davvero il poster più importante di LtU). – delnan
I tipi dipendenti consentono infatti una soluzione. –
Probabilmente è possibile ottenere qualcosa con un hack con "type level naturals", ma non è davvero una buona soluzione. –