我正在尝试创建一个类型的函数:
f1 :: [Car] -> String
其中Car是声明的类型,它是一个包含String,Int和更多元组列表的元组。我想使用map
函数来返回一个String,它将被传递到main
函数,然后作为单独的字符串输出。
无论如何,我有一个main函数调用函数f1,如下所示:
putStrLn(f1 listOfCars)
其中listOfCars被声明为你期待......
[("Ford", "Mondeo", 2009, [("Autotrader", 12000), ("Parkers", 11500)]),
("VW", "Golf", 2011, [("Autotrader", 16000), ("Parkers", 15250)]),...]
我使用带有模式和警卫的递归函数以及show
函数成功完成了此操作,但同时查看了map
和mapM
/ mapM_
函数I&# 39;我确定我可以用它们中的一个,以某种方式,以更有效的方式做到这一点。我正在寻找一些关于如何使用其中一个功能的帮助。
答案 0 :(得分:1)
首先需要创建一个将单个车辆转换为可查看字符串的新功能
carToString::Car->String
carToString car = <fill this in as you would like>
请注意,此功能比上面的f1更可重用!它可以用作构建块,用于存储在任何容器(树等)中的汽车。
一旦你有了这个,你可以按如下方式打印整个内容
putStrLn $ unlines $ map carToString listOfCars
或者,您可以使用forM_(只是flip mapM_
),如下所示
forM_ listOfCars $ \car -> do
putStrLn $ carToString car
或者如果你更喜欢简洁,
forM_ listOfCars $ putStrLn . carToString
请注意,可以修改第一个方法以提供f1 ....的替代定义。
putStrLn $ unlines $ map carToString listOfCars
与
相同putStrLn (unlines . map carToString $ listOfCars)
所以,f1可以定义为
f1 = unlines . map carToString
这是一种非常干净的方法来定义f1。