2013-04-08 143 views
0

截至大學一個大型項目寫在Haskell一個簡單的自定義語言的解釋的一部分,我想打印一些東西來幫助我,我的追求寫這個東西的清單。映射秀自定義數據類型

有一個自定義數據類型

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]) 

我收到錯誤「無法匹配預計類型「字符」與實際的類型「字符串」。

我一直在嘗試了一段時間來解決問題是在這裏。爲什麼提的字符,列表理解返回funcs列表?

回答

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

產生的String秒的列表,但putStrLn採用單個String,或[Char],作爲參數。

所以預期的類型列表中的元素爲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 <- progprog必須是一個列表,但參數interpretProg,包裹在一個構造Prog列表。你需要解開列表中的理解使用它的列表,例如

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

與作爲圖案,然後

func <- functions 
列表理解

+0

好的謝謝,這是非常有道理的。但是,現在Haskell抱怨說它不能與實際類型'Prog'匹配預期類型'[t0]'。這是一個我認爲我通過引入地圖顯示來修復的問題,但它好像只是掩蓋了它。對於這個窘境,你碰巧也有一個同樣令人驚訝的簡單解釋嗎? – nebffa 2013-04-08 03:38:59

+1

更新了可能的修復程序。 – 2013-04-08 03:44:49

+0

嘿,夥計非常感謝。你的解釋非常清楚,現在有道理。 – nebffa 2013-04-08 04:23:35

1

如前所述由丹尼爾,問題是putStrLn需要一個字符串,而不是一個字符串列表。

我建議插打印逗號分隔的列表。

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

您需要導入Data.List以獲取插入函數。