2017-04-02 1 views
0

이 프로그램에서 지금까지 C Char 인 사용자 지정 데이터 형식 인 Msg이 있습니다. 프로그램에서, 별도의 스레드가 생성되고, 개별 기능 userThreadderiving (Show)를 사용 main 나는 지점 받고동시 Haskell : 사용자 지정 데이터 형식의 데이터에 대한 작업

userThread 간의 간단한 통신 채널로서 작용하는 것 MVar에서 전송 된 문자를 키 입력을 수신하여 저장 문자열과 같이 터미널에서 메시지를 인쇄 할 수 있습니다. 출력은 j 사용자 유형의 경우 :

C 'j' 

(I 만 할 때 그것은 또한 C를 인쇄 참고 문자 자체)

나는 기존 목록을 가지고 있고 문자가 아닌 경우 내 목표는 목록에 추가 한 다음 추가하십시오. 일치하는 경우 추가하고 목록에서 해당 문자의 모든 인스턴스를 제거하지 마십시오. 사용자가 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으로 출력 한 후, 그것을 새로운 빈리스트에 추가하려고합니다. * 타입 []을 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] 앞에 추가 할 수 없으므로 오류가 발생합니다. 유형의 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 msgstr "<당신의 구현> – Chris

관련 문제