Pregunta

es posible en Haskell aplicar el constructor de tipo de flecha de la función (->) a solo su tipo de lado derecho (por ejemplo: (-> a)) para obtener un constructor de tipo de tipo * -> *?

¿Fue útil?

Solución

No, es actualmente imposible. Hay ciertas limitaciones para el sistema de tipo de Haskell que le permiten ser útil y conveniente para la mayoría de los casos, y esta es una de esas limitaciones. Tu mejor alternativa es usar un NewType.

newtype FuncFlip r a = FuncFlip { unFuncFlip :: a -> r }

Newtypes son simplemente etiquetas para ayudar al compilador a saber cómo escribir y realizar un envío dirigido por tipo (tipclasas) correctamente. Presumiblemente que querías voltear los argumentos de tipo para proporcionar alguna instancia de typlass. Eso solo significa que cuando quiera hacer uso de las funciones de esa tipografía, debe decorar ninguna entrada específica con FuncFlip, y no garantice cualquier salida específica con unFuncFlip. Esto es ligeramente más verboso de lo deseado, pero en realidad no es tan malo, porque le obliga a identificar explícitamente qué instancia de la tipografía que desea usar.

Puede crear una instancia de newtype para esto, que puede o no llegar a ser conveniente para usted.

instance Newtype (FuncFlip r a) (a -> r) where
  pack = FuncFlip
  unpack = unFuncFlip

Lectura adicional: ¿Hay "? -Evel combinatos? "

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top