2013-04-08 105 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以获取插入函数。