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?