2016-03-27 3 views
3

Ich bin total fest und ich fühle mich wie ich jetzt Hilfe gebrauchen kann, nur um gesund zu bleiben. Ich möchte etwas so einfaches wie Hinzufügen von Protokollierungsfunktionen zu einer Funktion, die Maybe zurückgibt, aber egal, wie sehr ich versuche, ich kann nur nicht die Typen richtig.Wrapping Vielleicht in WriterT Logging hinzufügen

Dies ist (wie ich sie wahrnehmen) die nächste könnte ich:

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 

Was mich noch einen Tippfehler ergibt:

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 } 

Wie soll ich den Code anpassen machen kompilieren und Arbeit?

Vielen Dank für Ihre Hilfe, Kollegen Haskellers!

Antwort

3

Um die zu Typprüfung, sollten innere Monaden lifted sein:

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

Anstatt also return $ q x müssen Sie schreiben: lift $ q x; wie in:

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

Dies ist wahrscheinlich das einzige, was ich nicht versucht habe, was ich haben sollte. Es funktioniert tatsächlich, danke! Du hast mich davor bewahrt, meinen Kopf gegen die Wand zu schlagen :-) – SkyWriter