私はHaskellで並行性が新しく、新しいMVarがmain
スレッドで作成された結果を取得しようとしています。ユーザーからの文字入力を受け取りuserThread
スレッドへの空、そしてMVARでその価値を置き、main
スレッド、それを印刷しています。ここで Haskell: "予想されるIO IO()をIO ThreadIdと一致させることができませんでした"
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.
正しい方向へのポインタは大きな助けになるでしょう! おかげでみんな
おかげで、これは助けました。私はそれだけでユーザが押した文字を印刷するために得ることができるか、今 ''(ショー)を導出使用して、私の文字をコンパイルして印刷するプログラムが、しかし、このための出力は、たとえば、 'C「g''で取得することができます? –
@SebMarshあなたはあなた自身の 'Show'インスタンスを定義することができます。あるいは好きなようにメッセージを印字する関数' Msg - > String'または 'Msg - > Text'を定義することができます(' putStrLn'を呼び出してstdout ) – jberryman
もう一度ありがとう。私がjberrymanに返答したとき、私はCharの場合、Stringのように動作するように私のMsgデータを得るために、このようなものを使うことができると考えました。私はこれをどうやって始めますか?私は自分のインスタンスを使用していないので、私はやや失われています。 –