Buena respuesta: No, lo que espera hacer no es realmente viable. Puede escribir una instancia que parece que hace lo que desea, posiblemente necesitando algunas extensiones de GHC en el proceso, pero no funcionará de la manera que le gustaría.
Respuesta poco inteligente: Probablemente pueda lograr lo que quiera utilizando una metaprogramación a nivel de tipo aterradora, pero puede ser complicado. Esto realmente no se recomienda a menos que absolutamente necesite esto para funcionar por alguna razón.
Las instancias oficiales no pueden depender realmente de otras instancias, porque GHC solo mira el "encabezado de instancia" cuando toma decisiones, y las restricciones de clase están en el "contexto". Para hacer algo así como un "sinónimo de clase de tipo" aquí, tendría que escribir lo que parece una instancia de Monad
para todos los tipos posibles, lo cual obviamente no tiene sentido. Se superpondrá con otras instancias de Monad
, que tiene sus propios problemas.
Además de eso, no creo que una instancia así cumpla con los requisitos de verificación de terminación para la resolución de instancia, por lo que también necesitaría la extensión UndecidableInstances
, lo que significa la capacidad de escribir instancias que enviarán el tipo de GHC verificador en un bucle infinito.
Si realmente quieres ir por ese agujero de conejo, busca un poco en Oleg Kiselyov's website; él es una especie de patrona de la metaprogramación de nivel de tipo en Haskell.
Es algo divertido, sin duda, pero si solo quieres escribir el código y hacerlo funcionar, probablemente no valga la pena.
Edit: De acuerdo, en retrospectiva he exagerado el problema aquí. Algo como PhantomMonad
funciona bien como una opción única y debe hacer lo que quiera, dado el Overlapping
- y UndecidableInstances
extensiones de GHC. Las cosas complicadas comienzan cuando quieres hacer algo mucho más complicado que lo que está en la pregunta. Mi más sincero agradecimiento a Norman Ramsey por haberme llamado, realmente debería haberlo sabido.
Todavía no realmente recomiendo haciendo este tipo de cosas sin una buena razón, pero no es tan malo como lo hice sonar. Mea culpa.
Is 'preturn :: a -> p b' a typo? –