将show显示为自定义数据类型的列表

时间:2013-04-08 03:29:23

标签: haskell

作为一个大型项目的一部分,我在Haskell为一个简单的自定义语言编写一个解释器,我试图打印一些东西来帮助我编写这个东西。

有自定义数据类型

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

当我尝试在此函数的最后一行打印此prog的实例时

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'匹配。

我一直在努力解决问题所在。当这个列表理解返回一个func列表时,为什么会提到字符?

2 个答案:

答案 0 :(得分: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 <- prog时,prog必须是一个列表,但interpret的参数是Prog,包含的列表构造函数Prog。您需要打开列表以在列表推导中使用它,例如

interpret prog@(Prog functions) vars entry _ = do

使用as-pattern,然后

func <- functions

在列表理解中。

答案 1 :(得分:1)

正如Daniel所说,问题是putStrLn需要一个String,而不是一个字符串列表。

我建议插入以打印以逗号分隔的列表。

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

您需要导入Data.List才能获得插入功能。