По какой-то причине GHC, кажется, решает, что мой тип данных (с двумя параметрами типа) без всякой причины создает экземпляр Bifunctor.
Самое смешное, что это используется только для того, чтобы сообщить мне, что существуют перекрывающиеся экземпляры Functor для этого типа данных, потому что я дал экземпляр Functor для любого Bifunctor (и конкретный для этого типа данных). Но, если я попытаюсь сделать на нем бимап, он скажет мне, что экземпляра Bifunctor нет.
{-# LANGUAGE FlexibleInstances #-}
module BifunctorError where
import Data.Bifunctor
instance Bifunctor f => Functor (f t) where
fmap = bimap id
data Provenance p t = Provenance p t
-- Uncomment and try to compile: Overlapping instances ???
--instance Functor (Provenance p) where
-- fmap f (Provenance p x) = Provenance p (f x)
Я ожидал, что, поскольку я не предоставил ничего, что указывало бы на то, что Provenance создает экземпляр Bifunctor, этого не произойдет, и поэтому экземпляр Functor, производный от Bifunctor, не должен иметь значения. Это ошибка FlexibleInstances?
Provenance
экземплярBifunctor
, даже если вы об этом не узнаете. Классы Haskell работают в соответствии с предположением открытого мира. (2) См. Также этот очень хороший ответ, который я не добавил в список целей, потому что их слишком много происходит где-то в этом вопросе и ответе. - person duplode   schedule 14.05.2019