[英]Mapping show to a list of a custom data type
作为一个大学的大型项目的一部分,该项目使用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”匹配。
我已经尝试了一段时间以找出问题所在。 当此列表理解返回函数列表时,为什么要提到字符?
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
用一个模式,然后
func <- functions
在列表理解中。
如Daniel所述,问题在于putStrLn需要一个String而不是String列表。
我建议插入以逗号分隔的列表。
putStrLn (intercalate ", " (map show [func | func <- prog, (func_name func) == entry]))
您需要导入Data.List以获得插入函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.