2016-03-27 26 views
3

Tamamen sıkışmış durumdayım ve sanırım şimdi sadece yardım etmek için biraz yardım kullanabiliyorum. Ben Maybe döndüren bir işlev için günlüğe kaydetme yetenekleri ekleme gibi basit bir şey istiyorum, ama ne kadar zorlu olursa olsun sadece doğru türleri alamıyorum. Hala bana bir yazım hatası verirSarma WriterT günlüğüne eklemek için

import Data.Maybe 
import Control.Monad 
import Control.Monad.Writer 

q :: Integer -> Maybe Integer 
q x = if x > 7 
     then Just x 
     else Nothing 

qlog :: Integer -> WriterT [String] Maybe Integer 
qlog x = do 
    tell ["Querying " ++ show x] 
    return $ q x 

:

Couldn't match type ‘Maybe Integer’ with ‘Integer’ 
Expected type: WriterT [String] Maybe Integer 
    Actual type: WriterT [String] Maybe (Maybe Integer) 
In a stmt of a 'do' block: return $ q x 
In the expression: 
    do { tell ["Querying " ++ show x]; 
     return $ q x } 
In an equation for ‘qlog’: 
    qlog x 
     = do { tell ["Querying " ++ show x]; 
      return $ q x } 

bunu derlemek yapmak için kodunu ayarlayın bileyim (bunu algıladıkları gibi)

Bu benim alabilir yakın ve iş?

Yardımlarınız için çok teşekkür ederim, Haskellers!

cevap

3

tip-çek için, iç monads lifted olmalıdır: return $ q x yerine Yani

lift :: (Monad m, MonadTrans t) => m a -> t m a 

, yazmak gerekir: lift $ q x; olduğu gibi:

qlog :: Integer -> WriterT [String] Maybe Integer 
qlog x = do 
    tell ["Querying " ++ show x] 
    lift $ q x 
+1

Muhtemelen denemediğim tek şey budur. Gerçekten çalışıyor, teşekkürler! Kafamın duvarına karşı daha fazla vurarak beni kurtardın :-) – SkyWriter