Czy instancje Functor są wyjątkowe?

Zastanawiałem się, w jakim stopniuFunctor instancje w Haskell są określone (wyjątkowo) przez prawa funktora.

Odghc może wynikaćFunctor w przypadku co najmniej typów danych typu „run-of-the-mill”, wydaje się, że muszą być unikalne przynajmniej w wielu różnych przypadkach.

Dla wygodyFunctor Definicje i prawa funktora to:

class Functor f where
  fmap :: (a -> b) -> f a -> f b

fmap id = id
fmap (g . h) = (fmap g) . (fmap h)

Pytania:

Czy można wyprowadzić definicjęmap wychodząc z założenia, że ​​jest toFunctor przykładdata List a = Nil | Cons a (List a)? Jeśli tak, jakie założenia należy wykonać, aby to zrobić?

Czy są jakieś typy danych Haskella, które mają więcej niż jedenFunctor przypadki, które spełniają prawa funktora?

Kiedy możeghc wyprowadzić afunctor instancja, a kiedy nie?

Czy to wszystko zależy od tego, jak zdefiniujemy równość? TheFunctor prawa są wyrażane w kategoriach równości wartości, ale nie wymagamyFunctors miećEq instancje. Czy jest tu jakiś wybór?

Jeśli chodzi o równość, z pewnością istnieje pojęcie tego, co nazywam „równością konstruktora”, co pozwala nam to rozumieć[a,a,a] jest równe[a,a,a] dla dowolnej wartościa dowolnego typu, nawet jeślia nie ma(==) zdefiniowane dla niego. Wszystkie inne (użyteczne) pojęcia równości są prawdopodobnie bardziej szorstkie niż ta relacja równoważności. Ale podejrzewam, że równość wFunctor prawa są raczej związkiem „równości rozumowania” i mogą być specyficzne dla aplikacji. Jakieś myśli na ten temat?

questionAnswers(2)

yourAnswerToTheQuestion