2016-06-02 6 views
2

Ich versuche, die aktuelle Zeit nach jeder in ghci ausgewerteten Zeile zu drucken. Hier ist mein Code so weit:Ich kann -interactive-print nicht verwenden, um Zeitstempel nach jeder Zeile in ghci zu drucken

module TimePrint (timePrint) where 

import System.IO 
import Data.Time 

getTime :: IO String 
getTime = do 
    now <- getCurrentTime 
    return (formatTime defaultTimeLocale "%T" now) 

timePrint :: Show a => a -> IO() 
timePrint a = putStrLn $ show a ++ "\n" ++ getTime 

Und ich bin mit ghci wie so: ghci -interactive-print=TimePrint.timePrint TimePrint

Der Fehler Ich erhalte, ist dies:

TimePrint.hs:12:44: 
    Couldn't match expected type ‘[Char]’ with actual type ‘IO String’ 
    In the second argument of ‘(++)’, namely ‘getTime’ 
    In the second argument of ‘(++)’, namely ‘"\n" ++ getTime’ 
Failed, modules loaded: none. 

entnehme ich, es hat etwas zu tun mit der Tatsache, dass timePrint nicht in der IO-Monade ist, aber ansonsten habe ich keine Ahnung. Irgendwelche Ideen? Ich würde jede Zeile von ghci Ausgabe mag wie etwas aussehen:

Prelude> 1+2 
3 
11:59:20 
Prelude> 3+4 
7 
12:00:16 

usw.

Antwort

2
timePrint a = do 
    s <- getTime 
    putStrLn $ show a ++ "\n" ++ s 

++ will einen String, keine IO Aktion.

+0

In anderen Worten, <- soll die IO-Aktion ausführen, und verwandeln Sie es in (in diesem Fall) eine Zeichenfolge? – masterchefsenior

+1

@masterchefsenior genau! – Franky