2016-03-27 6 views
3

私は完全に立ち往生しています。 Maybeを返す関数にロギング機能を追加するだけの単純なものが欲しいですが、どれほど難しいのですか、タイプを正しく取得できません。まだ私の入力ミス得Writerでラッピングをしてログを追加する可能性があります

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 } 

を、私はそれをコンパイルするためにコードを調整する必要がありますどのように(私はそれを感じるよう)

これは私が得ることができる最も近いです仕事?

ハスケラー君の助けをありがとう!

答えて

3

入力チェックをするために、内部モナドはlifted次のようになります。return $ q xの代わりにそう

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

、あなたが記述する必要があります。lift $ q xを。次のように:

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

これはおそらく私が持っていなければならなかった唯一のものです。本当にうまくいきます、ありがとう!あなたは私の頭を壁にぶつけてから救った:-) – SkyWriter

関連する問題