Мне было интересно, в какой степени экземпляры 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
является скорее отношением "рассуждения о равенстве" и может быть специфичным для приложения. Любые мысли об этом?