Supongamos que tengo alguna función genéricaProporcionar un cuerpo de función diferente para una función genérica basada en el tipo
genericFunc :: a -> b
genericFunc x = doSomeHardWork
Pero para un tipo particular, hay una manera mucho más eficiente que genericFunc
se podría hacer.
genericFunc :: ParticularType -> b
genericFunc x = doSomeEasyWork
¿Cuál es la mejor manera de combinar estos dos cuerpos de las funciones en el mismo genericFunc
, de tal manera que cuando se utiliza en ParticularType
, se doSomeEasyWork
, pero cuando se usa en otros tipos, se doSomeHardWork
? Estoy excluyendo específicamente la opción de usar un nombre diferente o diferentes módulos.
Creo que esto se puede hacer con una clase de letra, pero estoy más interesado en las soluciones que usan pragmas de lenguaje. Tengo una vaga noción de que esto se puede hacer con lenguaje pragmático, pero no tengo idea de cómo. Puntos de bonificación si compara y contrasta estos enfoques y/o cualquier otro enfoque posible.
vagamente inspirado por pensar en esta pregunta: [Si hay algo que no es una lista] (http://stackoverflow.com/questions/ 8463777/if-something-is-not-a-list-in-haskell) –