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

我收到一条错误消息“无法将预期类型 'Char' 与实际类型 'String' 匹配。

我已经尝试了一段时间来找出问题所在。当这个列表理解返回一个函数列表时,为什么会提到字符?

4

2 回答 2

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

生成一个Strings 列表,但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是 a Prog,一个包含在构造函数中的列表Prog。例如,您需要解开列表以在列表理解中使用它

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

使用 as-pattern,然后

func <- functions

在列表理解中。

于 2013-04-08T03:34:40.667 回答
1

正如丹尼尔所说,问题在于 putStrLn 需要一个字符串,而不是字符串列表。

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

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

您需要导入 Data.List 以获取 intercalate 功能。

于 2013-04-08T03:44:02.640 回答