Famílias de tipo fechado e tipos de função estranhos
Desculpe, eu não conseguia imaginar um título melhor para a pergunta, então leia adiante. Imagine que temos uma família de tipos fechados que mapeia todos os tipos correspondentesMaybe
exceto os próprios talvez:
type family Family x where
Family (Maybe x) = Maybe x
Family x = Maybe x
Podemos até declarar uma função usando esse tipo de família:
doMagic :: a -> Family a
doMagic = undefined
exampleA = doMagic $ Just ()
exampleB = doMagic $ ()
Brincar com ele no GHCi mostra que não há problema em avaliar o tipo desse aplicativo de função:
*Strange> :t exampleA
exampleA :: Maybe ()
*Strange> :t exampleB
exampleB :: Maybe ()
A questão é se é possível fornecer alguma implementação dodoMagic
função excetoundefined
? Digamos, por exemplo, que eu gostaria de agrupar todos os valores em umJust
construtor, exceto Maybes, que deve permanecer intacto, como eu poderia fazer isso? Tentei usar classes tipográficas, mas não consegui escrever uma assinatura compilável para a função doMagic se não estiver usando famílias de tipos fechados, alguém poderia me ajudar?