我是新来的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我想我可以使用这样的事情来获取我的消息数据像一个字符串,如果它是一个字符。我如何着手做这件事?我之前没有使用过自己的实例,所以我有点迷路。 –