As instâncias do Functor são exclusivas?
Eu queria saber em que medidaFunctor
instâncias em Haskell são determinadas (unicamente) pelas leis do functor.
Desde aghc
pode derivarFunctor
instâncias para, pelo menos, tipos de dados "comuns", parece que eles devem ser únicos, pelo menos em uma ampla variedade de casos.
Por conveniência, oFunctor
leis de definição e functor são:
class Functor f where
fmap :: (a -> b) -> f a -> f b
fmap id = id
fmap (g . h) = (fmap g) . (fmap h)
Questões:
Pode-se derivar a definição demap
partindo do pressuposto de que é umFunctor
exemplo paradata List a = Nil | Cons a (List a)
? Em caso afirmativo, que suposições devem ser feitas para fazer isso?
Existem quaisquer tipos de dados do Haskell que tenham mais de umFunctor
instâncias que satisfazem as leis do functor?
Quando podeghc
derivar umfunctor
instância e quando não pode?
Tudo isso depende de como definimos a igualdade? oFunctor
leis são expressas em termos de uma igualdade de valores, mas não exigimosFunctors
TerEq
instâncias. Então, há alguma escolha aqui?
Em relação à igualdade, há certamente uma noção do que eu chamo de "igualdade construtora" que nos permite raciocinar que[a,a,a]
é igual a[a,a,a]
para qualquer valor dea
de qualquer tipo, mesmo sea
não tem(==)
definido para isso. Todas as outras (úteis) noções de igualdade são provavelmente mais grosseiras que essa relação de equivalência. Mas eu suspeito que a igualdade naFunctor
as leis são mais uma relação de "igualdade de raciocínio" e podem ser específicas da aplicação. Alguma idéia sobre isso?