Quindi, sto lavorando ad un divertente esperimento in senso contestuale e sto correndo contro un muro. Sto provando a definire un tipo di dati che può essere una primitiva o una funzione che si trasforma da un costruttore all'altro.Vincolare i costruttori in una firma
data WeaponPart =
WInt Int |
WHash (Map.Map String Int) |
WNull |
WTrans (WeaponPart -> WeaponPart)
instance Show WeaponPart where
show (WInt x) = "WInt " ++ (show x)
show (WHash x) = "WHash " ++ (show x)
show (WTrans _) = "WTrans"
show WNull = "WNull"
cold :: WeaponPart -> WeaponPart
cold (WInt x) = WHash (Map.singleton "frost" x)
cold (WHash x) = WHash $ Map.insertWith (+) "frost" 5 x
cold (WTrans x) = cold $ x (WInt 5)
cold (WNull) = cold $ (WInt 5)
ofTheAbyss :: WeaponPart -> WeaponPart
ofTheAbyss (WTrans x) = x (WTrans x)
Il problema è che la firma per ofTheAbyss
permette a qualsiasi WeaponPart come argomento, mentre io solo voglio permettere argomenti Wtrans-constructred. Puoi vedere che ho solo scritto una corrispondenza di modello per quel caso.
Ho provato a fare con GADT ma temo fosse una tana di coniglio. Non sono mai riuscito a convincerli a fare ciò che volevo. Qualcuno ha qualche idea su come applicare solo gli argomenti di WTrans a TheAbyss? O mi manca solo qualcosa.
Grazie.
migliore, Erik
Questa è una risposta fantastica. Intendevo dire che il modo in cui stavo usando i GADT era una tana di coniglio ma qualcuno, ovviamente, molto più saggio avrebbe potuto dare un senso. E la mia luce, qualcuno ha fatto! Meraviglioso. Non avrei mai avuto modo di avere entrambe le cose, vale a dire il WeaponPart Compound e il Some WeaponPart. Inoltre, questo è un ottimo esempio di sistemi di tipo embedded che fanno il punto della situazione. –
Un'ultima cosa, l'ho fatto funzionare che è molto eccitante per me. L'unica cosa che dovevo cambiare era che dovevo eliminare la parte PolyKinds e rendere 'data Sort = Base | Composto' in solo 'base dati' e' dat Compound'. Continuava a lamentarsi, giustamente, che Base non fosse un costruttore di tipi. C'è qualcosa che mi manca con PolyKinds? Più probabilmente. –
Ahh, lascerò il mio errore ad altri per imparare da: Avevo bisogno del pragma di DataKinds, non del pragma di PolyKinds. Tutte queste nuove estensioni fantasiose. –