2013-04-08 2 views
0

단순한 사용자 지정 언어에 대해 하스켈에서 통역사를 작성하는 대규모 프로젝트의 일환으로이 기사를 쓰는 데 도움이되는 몇 가지 사항을 인쇄하려고합니다. .사용자 지정 데이터 형식의 목록에 매핑 표시

가 사용자 정의 데이터 형식을

data Prog = Prog [Func] 
    deriving (Show, Read) 

을 그리고 내가이 함수의 마지막 줄이 음식물의 인스턴스를 인쇄 할 때

interpret :: Prog -> Vars -> String -> MaybeDebug -> IO() 
interpret prog vars entry _ = do 
    putStrLn "The interpreter isn't written yet. Better get onto that!" 
    putStrLn "\n\n" 
    putStrLn (show prog) 
    putStrLn "\n\n" 
    putStrLn (show vars) 
    putStrLn "\n\n" 
    putStrLn (show entry) 
    putStrLn "\n\n" 
    putStrLn (map show [func | func <- prog, (func_name func) == entry]) 

내가 오류 메시지가 "일치 할 수 없습니다 예상 유형 'Char'와 실제 유형이 'String'인 경우

나는이 문제가 무엇인지 알아 내려고 노력하고 있습니다. 왜이 목록 이해가 기능 목록?

답변

10
map show [func | func <- prog, (func_name func) == entry] 

String의 목록을 생성하지만, 인수로, 하나의 String, 또는 [Char]putStrLn합니다.

목록 요소의 예상 유형은 Char이지만 실제 유형은 String입니다.

당신이 원하는 것을 출력에 따라, 마지막 줄

putStrLn (unlines $ map show [func | func <- prog, (func_name func) == entry]) 

또는

mapM_ putStrLn (map show [func | func <- prog, (func_name func) == entry]) 

과 같이해야한다 (즉, 더 나은

mapM_ print [func | func <- prog, (func_name func) == entry] 

그러나이 될 것이다). 당신이 func <- prog, prog이 목록해야 쓸 수 있지만 때

다음, 지능형리스트에서, interpret의 인수는 생성자 Prog에 싸여 목록은 Prog입니다. 당신은 같은 패턴으로 예를

interpret [email protected](Prog functions) vars entry _ = do 

를 들어, 지능형리스트에서 사용할 수있는 목록을 풀다해야하고, 지능형리스트에서 다음

func <- functions 

.

+0

정말 고마워요. 그러나 현재 하스켈은 예상 유형 '[t0]'을 실제 유형 'Prog'과 일치시킬 수 없다고 불평합니다. 이것은 내가 맵 쇼를 도입하여 고쳐 졌다고 생각한 문제이지만, 그냥 마스킹 한 것처럼 보입니다. 이 곤경에 대해 똑같이 놀라 울 정도로 간단한 설명을하고 있습니까? – nebffa

+1

가능한 수정 사항으로 업데이트되었습니다. –

+0

어이 대단히 고마워.당신의 설명은 정말 분명합니다. 지금은 이해가됩니다. – nebffa

1

Daniel이 말한 것처럼 putStrLn은 문자열 목록이 아니라 문자열을 기대합니다.

쉼표로 구분 된 목록을 인쇄하려면 삽입하는 것이 좋습니다.

putStrLn (intercalate ", " (map show [func | func <- prog, (func_name func) == entry])) 

intercalate 기능을 사용하려면 Data.List를 가져와야합니다.

관련 문제