在Haskell中,当你只传递一个列表时,map函数意味着什么?

时间:2013-02-14 16:46:33

标签: haskell map parameters pointfree partial-application

在我调试的Haskell项目中,代码中有一些实例,map只使用一个参数 - 一个列表 - 被传递。

例如

printReports :: [Report] -> IO ()
printReports = putStrLn . unlines . map show

printRuns' :: [Run] -> IO ()
printRuns' = putStrLn . unlines . map showRecipes'

map在这种情况下的意思/做法是什么?

4 个答案:

答案 0 :(得分:10)

地图类型:

map :: (a -> b) -> [a] -> [b]

因此,您必须提供从ab的功能以及类型a的列表。

在您的示例中,该功能已经提供(showshowRecipes'),因此,您只需提供printReportsprintRuns'列表。< / p>

这里发生了什么叫 部分应用功能 ,请看这里 http://www.haskell.org/haskellwiki/Partial_application

答案 1 :(得分:10)

正如其他人所说,map show是一个部分应用的功能,阅读它是一个好主意。但是你给出的代码也是point-free编程风格的一个例子,你可能更容易理解它。函数printReports也可以写成

printReports xs = (putStrLn . unlines . map show) xs

或等同地

printReports xs = putStrLn . unlines . map show $ xs

一般来说,以下所有内容都是等效的:

myFunction x y z = someExpression x y z
myFunction x y = someExpression x y
myFunction x = someExpression x
myFunction = someExpression

这有点过于简单化,但它会让你开始。

答案 2 :(得分:3)

根据经验,如果你有这样的东西......

foo = bar . foobar . blafasel

...你可以在心理上用$代替点,然后在两边添加一个变量

foo x = bar $ foobar $ blafasel x

为什么这个工作已经在其他答案中解释过,但是这个技巧可以让我在没有太多思考的情况下阅读无点风格。

答案 3 :(得分:2)

在此上下文映射中,将show函数应用于列表中的每个报表。 结果应该类似于[show report0,show report1,...,show reportn]

换句话说,您为show函数列表中的每个报告类型项传递报告列表和功能图 map

您构建的函数的方式与point free style相对应。