我是新來的Haskell併發性,我試圖得到一個結果,在main
線程中創建一個新的MVar,通過清空userThread
線程,該線程從用戶處接收字符輸入,然後將該值放入MVar中並使線程打印它。Haskell:「無法與IO ThreadId匹配預期類型IO()」
這裏是我迄今爲止
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)
現在,我卡在試圖把輸入的字符到無功,我已經粘貼了以下錯誤
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.
任何指向正確方向的指針都將非常有幫助! 謝謝大家
謝謝,這有幫助。我現在可以使用'deriving(Show)'來編譯和打印我的字符,但是,這個輸出例如是'C'g'',我怎麼才能打印出用戶按下的字符? –
@SebMarsh你可以定義你自己的'Show'實例,或者你可以定義一個函數'Msg-> String'或Msg-> Text',然而你喜歡打印一條消息(然後調用'putStrLn'將它寫入標準輸出) – jberryman
再次感謝。正如我回復jberryman我想我可以使用這樣的事情來獲取我的消息數據像一個字符串,如果它是一個字符。我如何着手做這件事?我之前沒有使用過自己的實例,所以我有點迷路。 –