Por lo tanto, estoy trabajando en un experimento divertido en el sentido contextual y estoy corriendo en una pared. Estoy tratando de definir un tipo de datos que puede ser una primitiva o una función que se transforma de un constructor a otro.Constricción de constructores en 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)
los problemas es que la firma de ofTheAbyss
permite a cualquier WeaponPart como argumento, mientras que sólo quiero permitir que argumentos Wtrans-fabricarse de manera. Puedes ver que solo he escrito una coincidencia de patrón para ese caso.
He intentado hacer con GADT pero me temo que era un agujero de conejo. Nunca podría hacer que hagan lo que yo quería. ¿Alguien tiene alguna idea de cómo podría aplicar solo argumentos de WTrans en TheAbyss? O simplemente me estoy perdiendo algo por completo.
Gracias.
mejor, Erik
Esta es una respuesta tan fantástica. Quise decir que la forma en que estaba usando GADT era un agujero de conejo, pero alguien, obviamente, mucho más sabio podría darle sentido. Y mi luz, ¡alguien lo hizo! Maravilloso. Nunca habría conseguido cómo hacerlo en ambos sentidos, a saber, tener el Compuesto WeaponPart y Some WeaponPart. Además, este es un gran ejemplo de sistemas de tipo integrado que salvan el día. –
Una última cosa, lo tengo funcionando, lo cual es enormemente emocionante para mí. Lo único que tuve que cambiar fue sacar la parte de PolyKinds y hacer 'data Sort = Base | Compound' en solo 'base de datos' y' dat Compuesto'. Siguió quejándose, con razón, de que Base no era un constructor de tipos. ¿Hay algo que me falta con PolyKinds? Más probable. –
Ahh, dejaré mi error para que otros aprendan: necesitaba el pragma de DataKinds, no el pragma de PolyKinds. Todas estas nuevas extensiones de lujo. –