繁体   English   中英

将节目映射到自定义数据类型的列表

[英]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 <- progprog必须是一个列表,但是要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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM