У меня есть эта часть кода:
{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, KindSignatures, GADTs, FlexibleInstances, FlexibleContexts #-}
class Monad m => Effect p e r m | p e m -> r where
fin :: p e m -> e -> m r
data ErrorEff :: * -> (* -> *) -> * where
CatchError :: (e -> m a) -> ErrorEff ((e -> m a) -> m a) m
instance Monad m => Effect ErrorEff ((e -> m a) -> m a) a m where
fin (CatchError h) = \f -> f h
Это не скомпилируется с этой ошибкой типа в последней строке:
Could not deduce (a1 ~ a)
from the context (Monad m)
[...]
or from (((e -> m a) -> m a) ~ ((e1 -> m a1) -> m a1))
[...]
Если я изменяю m
на []
, он компилируется отлично, поэтому, по-видимому, GHC считает, что m
не является инъективным. (Хотя он не предупреждает об инъективности, как это происходит с семействами типов.)
Моя версия GHC - это 7.2.1.
Изменить: если я изменяю (e -> m a)
на e
, он работает, если я его изменяю на m a
, это не так, и ни для (m a -> e)
.