Ich bin neu zu Nebenläufigkeit in Haskell und ich versuche, ein Ergebnis zu erhalten, wo eine neue MVar im Thread main
gemacht wird, wird übergeben leer zum userThread
Thread, der eine Zeicheneingabe vom Benutzer nimmt, dann legt diesen Wert in eine MVar und hat den main
Thread es drucken.Haskell: "Ich konnte den erwarteten Typ IO() mit IO ThreadId nicht"
Hier ist, was ich
module Main where
import Control.Concurrent
import Control.Monad
import System.IO
import System.Random
import Text.Printf
data Msg = C Char | Time
main :: IO()
main = do
hSetBuffering stdout NoBuffering
hSetBuffering stdin NoBuffering
hSetEcho stdin False
-- shared resources
chan <- newEmptyMVar
forkIO $ userThread chan
--r <- takeMVar chan
--show(r)
userThread :: MVar Msg -> IO()
userThread chan = forever $ do
x <- getChar
putMVar chan (C x)
Gerade jetzt so weit, ich zu versuchen, die eingegebenen Zeichen in die MVar bin stecken zu setzen, habe ich den Fehler unter
assignment1.hs:20:3: error:
* Couldn't match type `ThreadId' with `()'
Expected type: IO()
Actual type: IO ThreadId
* In a stmt of a 'do' block: forkIO $ userThread chan
In the expression:
do { hSetBuffering stdout NoBuffering;
hSetBuffering stdin NoBuffering;
hSetEcho stdin False;
chan <- newEmptyMVar;
.... }
In an equation for `main':
main
= do { hSetBuffering stdout NoBuffering;
hSetBuffering stdin NoBuffering;
hSetEcho stdin False;
.... }
Failed, modules loaded: none.
geklebt Irgendwelche Hinweise in die richtige Richtung wären eine große Hilfe! Vielen Dank alle
Danke, das hat geholfen. Ich kann jetzt das Programm zum kompilieren und Drucken meines Chars mit 'Ableiten (Zeigen)', aber die Ausgabe dafür ist zum Beispiel 'C 'g'', wie kann ich es bekommen, nur das Zeichen vom Benutzer gedrückt zu drucken ? –
@SebMarsh können Sie Ihre eigene 'Show' -Instanz definieren oder Sie können eine Funktion' Msg -> String' oder 'Msg -> Text' definieren, die eine Nachricht ganz nach Ihren Wünschen ausgibt (rufen Sie dann' putStrLn' auf, um sie in stdout zu schreiben)) – jberryman
Danke nochmal. Als ich auf jberryman antwortete, dachte ich mir, dass ich so etwas verwenden könnte, um meine Msg-Daten als String zu verwenden, wenn es ein Char ist. Wie würde ich damit anfangen? Ich habe meine eigenen Instanzen vorher nicht benutzt, also bin ich etwas verloren. –