2017-04-02 10 views
0

このプログラムでは、カスタムデータ型Msgがあり、これはC Charです。プログラムでは、別のスレッドが作成され、別個の機能userThreadderiving (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] 

どのように私は私のメッセージは、このリストの中に収まることができますか?あなたの助けをありがとう。

+0

'C r < - takeMVar chan' – melpomene

+0

私はまだタイプの問題がありますが、あなたの返事ありがとうございます。Haskellに 'Msg'を単独でcharを出力させた後、新しい空リストに追加しようとしました' * [type []とIO []を一致させることができませんでした。予想タイプ:IO Char 実際のタイプ:[Char] ' –

答えて

0

あなたのリストにC Charが含まれず、むしろCharが含まれないという問題点があります。これは、let x = [C '1',C 's',C 'g',C '4',C '5']を実行して修正することができます。あなたのuserThread

はそうあなたがtakeMVar (chan)でそれを解凍し、rにバインドするとき、rは今Msg型を持つ、chanC Charます。 Haskellのリストでは同じ型の値しか保持できないので、Msg[Char]の先頭に置くことはできません。そのため、エラーが発生します。 Msgのタイプのxの要素をすべて作成してください。うまくいけばいいですね。別の方法としては、

toChar :: Msg -> Char toChar C c = c

を実装し、あなたのリストにCharを持つ上で主張すれば(toChar r):xような何かを行うことができます。

xからのremvoing要素については、thisを参照してください。助け

if elem r x then newX = remove r x else newX = r:x --if x contains Msg 
if elem cr x then newX = remove cr x else newX = cr:x 
    where cr = toChar r --if you insist on having chars in x... 

希望:あなたは、並べ替えの何かを書くことができます。

+0

aside: 'deriving(Show)'があなたの 'Msg'を表現する方法に慣れていない場合、' Msg'はshowの独自の実装を提供することによって 'Show'型クラスのインスタンスにすることができます:' instance Show msgstr "あなたのshowの実装"> – Chris

関連する問題