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?
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. –
Kodunuz ayrıca GHC 8.0.1'in kararlı sürümünde yazımlar. – duplode
@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ı! –