2016-11-28 31 views
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?

+0

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. –

+1

Twój kod również sprawdza typ w stabilnej wersji GHC 8.0.1. – duplode

+2

@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! –

Odpowiedz