Являются ли экземпляры Functor уникальными?

Мне было интересно, в какой степениFunctor экземпляры в Haskell определяются (однозначно) по законам функторов.

посколькуghc может вывестиFunctor По крайней мере, в случаях, когда используются типы данных "заурядный", кажется, что они должны быть уникальными, по крайней мере, в самых разных случаях.

Для удобстваFunctor определения и функторные законы:

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

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

Вопросов:

Можно ли получить определениеmap исходя из предположения, что этоFunctor экземпляр дляdata List a = Nil | Cons a (List a)? Если да, какие предположения должны быть сделаны для того, чтобы сделать это?

Существуют ли типы данных Haskell, которые имеют более одногоFunctor случаи, которые удовлетворяют законам функторов?

Когда сможешьghc вывестиfunctor экземпляр и когда не может это?

Зависит ли все это от того, как мы определяем равенство?Functor законы выражаются через равенство ценностей, но мы не требуемFunctors иметьEq экземпляров. Так есть ли здесь выбор?

Что касается равенства, безусловно, существует понятие того, что я называю «равенством конструкторов», что позволяет нам рассуждать о том, что[a,a,a] равно[a,a,a] для любого значенияa любого типа, даже еслиa не имеет(==) определено для этого. Все другие (полезные) понятия равенства, вероятно, являются более грубыми, чем это отношение эквивалентности. Но я подозреваю, что равенство вFunctor Законы - это скорее отношения «разумного равенства» и могут зависеть от конкретного приложения. Есть мысли по этому поводу?

Ответы на вопрос(2)

Ваш ответ на вопрос