作为一个大型项目的一部分,我在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列表时,为什么会提到字符?
答案 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才能获得插入功能。