Haskell aplicar a função de seta para apenas o tipo de resultado?
-
13-12-2019 - |
Pergunta
É possível em Haskell para aplicar a função de seta tipo de construtor (->) para somente o seu lado direito tipo (por exemplo:(-> a)) para obter um tipo de construtor de tipo * -> *?
Solução
Não, é actualmente impossível.Existem certas limitações para o Haskell o tipo de sistema que permitem que ele seja útil e conveniente para a maioria dos casos, e esta é uma dessas limitações.A sua melhor alternativa é usar um newtype.
newtype FuncFlip r a = FuncFlip { unFuncFlip :: a -> r }
Newtypes são simplesmente tags para ajudar o compilador sabe como tipo verificação e executar o tipo-dirigido despacho (typeclasses) corretamente.Provavelmente você queria virar o tipo de argumentos para fornecer alguns typeclass instância.Isso apenas significa que sempre que você quiser fazer uso do que typeclass funções, você tem que decorar qualquer insumos específicos com FuncFlip
, e undecorate qualquer saídas específicas com unFuncFlip
.Isso é um pouco mais detalhado do que o desejado, mas é, na verdade, não é tão ruim, porque força você a identificar explicitamente a instância do typeclass você deseja usar.
Você pode criar uma instância de Newtype para isso, o que pode ou não vir a ser conveniente para você.
instance Newtype (FuncFlip r a) (a -> r) where
pack = FuncFlip
unpack = unFuncFlip
Leitura adicional: Existem "tipo-nível combinatos?"