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?

questionAnswers(2)

yourAnswerToTheQuestion