使用map / mapM函数返回一个String,为putStrLn准备单独的列表元素

时间:2016-03-05 22:59:39

标签: haskell dictionary newline

我正在尝试创建一个类型的函数:

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函数成功完成了此操作,但同时查看了mapmapM / mapM_函数I&# 39;我确定我可以用它们中的一个,以某种方式,以更有效的方式做到这一点。我正在寻找一些关于如何使用其中一个功能的帮助。

1 个答案:

答案 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。