이 프로그램에서 지금까지 C Char
인 사용자 지정 데이터 형식 인 Msg
이 있습니다. 프로그램에서, 별도의 스레드가 생성되고, 개별 기능 userThread
는 deriving (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]
가 어떻게이 목록에 내 메시지에 맞는을 만들 수 있습니까? 도와 주셔서 대단히 감사합니다.
'C r <- takeMVar chan' – melpomene
답장을 보내 주셔서 감사합니다. 아직 유형 문제가 있지만.Haskell이'Msg'를 자체적으로 char으로 출력 한 후, 그것을 새로운 빈리스트에 추가하려고합니다. * 타입 []을 IO 과 일치시킬 수 없습니다. 예상 유형 : IO Char 실제 타입 : [Char]' –