このプログラムでは、カスタムデータ型Msg
があり、これはC Char
です。プログラムでは、別のスレッドが作成され、別個の機能userThread
はderiving (Show)
を使用して、main
及びI点に得ている並行Haskell:カスタムデータ型内のデータに作用する
userThread
間の単純な通信チャネルとして働くいMVar
で送信チャーのキーストロークをリッスンして記憶します文字列のように、ターミナルに関するメッセージを印刷することができます。
C 'j'
(私は文字自体をしたいとき、それはまた、Cを印刷します)
私は、既存のリストを持っており、charがその中でされていない場合は、私の目的は次のとおりです。出力されj
ユーザータイプの場合リストを作成し、追加します。存在する場合は、追加しないで、リスト内のその文字のすべてのインスタンスを削除します。ユーザーがc
を入力した場合たとえば、その後、
[a,b] becomes [a,b,c]
しかし
[f,c,c,h,c] becomes [f,h]
私の現在のコードは以下の
されています:
module Main where
import Control.Concurrent
import Control.Monad
import System.IO
import System.Random
import Text.Printf
data Msg = C Char deriving (Show)
main :: IO()
main = loop
where
loop = do
hSetBuffering stdout NoBuffering
hSetBuffering stdin NoBuffering
hSetEcho stdin False
--already existing list
let x = [1, 's', 'g', 4 ,5]
chan <- newEmptyMVar
forkIO $ userThread (chan)
r <- takeMVar (chan)
putStrLn $ show x
print r
-- Listens for keystrokes from the user, the passes them to the main thread
userThread :: MVar Msg -> IO()
userThread chan = do
c <- getChar
putMVar chan (C c)
私はと私は混乱していますその実際の内容がcharであるため、私のMsg
で印刷するようなアクションを実行できます。私はr:x
コンパイルエラーを使用してリストに広告にそれをしようとすると、しかし、こう述べています。
* Couldn't match type `Char' with `Msg'
Expected type: [Msg]
Actual type: [Char]
どのように私は私のメッセージは、このリストの中に収まることができますか?あなたの助けをありがとう。
'C r < - takeMVar chan' – melpomene
私はまだタイプの問題がありますが、あなたの返事ありがとうございます。Haskellに 'Msg'を単独でcharを出力させた後、新しい空リストに追加しようとしました' * [type []とIO []を一致させることができませんでした。予想タイプ:IO Char 実際のタイプ:[Char] ' –