2016-11-28 39 views
10

Aşağıdaki kodu var:GHC 7.10'da tip denetimi yapılan bu kod neden GHC 8.0.1'de yazım denetimi yapmıyor?

{-# 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) 

Şanlı Glasgow Haskell Derleme Sistemi Kullanılarak, sürüm 8.0.1.20161117, bu derlenmeyecektir:

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) 

Ancak ghc 7.10 yılında, bu bir sorun olmadan derler .

GHC 8 doğru mu, yoksa bir hata mı buldum?

+0

Merak etme, 'nı 'n' varsayılan imzada 'n' gibi bir başka tür değişkenine değiştirirseniz veya açık bir 'forall' eklerseniz çalışır mı? GHC'nin, bir sebepten dolayı burada "m" yi kapsamlı bir değişken olarak ele alıp almadığını merak ediyorum. –

+1

Kodunuz ayrıca GHC 8.0.1'in kararlı sürümünde yazımlar. – duplode

+2

@AlexisKing, bu aslında sorun. Sınıf beyanının başı (burada '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''' '' '' '' '' 'her zaman kapsamlıdır, aksi takdirde' m 've yöntemlerin türü arasında bir ilişki olmazdı! –

cevap