10
Mam następujący kod:Dlaczego ten kod, który został sprawdzony w GHC 7.10, nie zawiera już sprawdzania w GHC 8.0.1?
{-# LANGUAGE DefaultSignatures#-}
import Control.Monad.Trans.Class
import Control.Monad.Trans.Maybe
class Monad m => MonadMaybe m where
liftMaybe :: Maybe a -> m a
default liftMaybe :: (MonadTrans t, MonadMaybe m) => Maybe a -> t m a
liftMaybe = lift . liftMaybe
instance MonadMaybe m => MonadMaybe (MaybeT m)
Korzystanie chwalebnej Glasgow Haskell kompilacja systemu, wersja 8.0.1.20161117, to nie trafia do kompilacji:
foo.hs:11:10: error:
• Couldn't match type ‘m’ with ‘MaybeT m’
‘m’ is a rigid type variable bound by
the instance declaration at foo.hs:11:10
Expected type: Maybe a -> MaybeT m a
Actual type: Maybe a -> MaybeT (MaybeT m) a
• In the expression: Main.$dmliftMaybe @MaybeT m
In an equation for ‘liftMaybe’:
liftMaybe = Main.$dmliftMaybe @MaybeT m
In the instance declaration for ‘MonadMaybe (MaybeT m)’
• Relevant bindings include
liftMaybe :: Maybe a -> MaybeT m a (bound at foo.hs:11:10)
Jednak w GHC 7.10, to kompiluje bez problemu .
Czy GHC 8 jest poprawny, czy też znalazłem błąd?
Z ciekawości, czy działa, jeśli zmienisz 'm' w domyślnej sygnaturze na inną zmienną typu, np.' N', lub dodasz jawne 'forall'? Zastanawiam się, czy GHC traktuje "m" jako zmienną o ograniczonym zakresie z jakiegoś powodu. –
Twój kod również sprawdza typ w stabilnej wersji GHC 8.0.1. – duplode
@AlexisKing, to zasadniczo problem. Wystąpienia naczelnika deklaracji klasowej (tutaj "m") są zawsze umiejscowione w ciele, w przeciwnym razie nie byłoby zależności między 'm' a typem metod! –