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 * -> *?

Foi útil?

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?"

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top