Acabo de empezar a aprender Haskell. Creo que tengo lo básico, pero quiero asegurarme de que realmente me obligo a pensar funcionalmente también.Creando funciones sobre Enumeraciones
data Dir = Right | Left | Front | Back | Up | Down deriving (Show, Eq, Enum)
inv Right = Left
inv Front = Back
inv Up = Down
De todos modos, la jist de lo que estoy tratando de hacer es crear una función para mapear entre cada "Dir" y su opuesto/inv. Sé que podría continuar esto fácilmente por otras 3 líneas, pero no puedo evitar preguntarme si hay una mejor manera. Intenté agregar:
inv a = b where inv b = a
pero aparentemente no se puede hacer eso. Entonces mi pregunta es: ¿hay alguna forma de generar el resto de las inversas o una forma mejor de crear esta función?
Muchas gracias.
Eso es mejor. Capture con precisión el concepto central (dimensión y dirección) en tipos. –
tiene sentido. Encontrar el inverso de "inv Positive" sobre "Sign" es mejor que encontrar el inverso de "inv Right" sobre todo "Dir". Entonces la única manera de hacer un 'inverso' limpiamente es hacer que lo que estás invirtiendo sea realmente pequeño ... – rcbuchanan
@ rcb451, te estás perdiendo el punto. El hecho de que 'Sign' tenga menos constructores de datos es incidental (aunque ciertamente beneficioso). La observación clave es que la estrecha relación entre 'Izquierda' y 'Derecha' debe reflejarse en sus tipos, así como la relación distante entre (por ejemplo) 'Izquierda' y 'Superior'. El sistema de tipos está ahí para ayudar con las invariantes: con más tipos puede expresar invariantes más precisos. – Lambdageek