3

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

例如

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

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

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

4

4 回答 4

10

地图类型:

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

所以你必须提供一个函数 from atob和一个 type 列表a

在您的示例中,该函数已经给出(showshowRecipes'),因此,您只需提供printReportsprintRuns'一个列表。

那里发生的事情称为部分应用功能,请参见此处 http://www.haskell.org/haskellwiki/Partial_application

于 2013-02-14T16:53:14.007 回答
10

正如其他人所说,map show这是一个部分应用的功能,阅读它是一个好主意。但是您给出的代码也是无编程风格的示例,您可能更容易理解它。该函数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

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

于 2013-02-14T17:09:48.347 回答
3

根据经验,如果你有这样的事情......

foo = bar . foobar . blafasel

...您可以在心理上替换点$并在两侧添加一个变量

foo x = bar $ foobar $ blafasel x

为什么这个工作已经在其他答案中进行了解释,但是这个技巧可以帮助我阅读无点风格而不需要太多思考。

于 2013-02-15T07:55:04.343 回答
2

在此上下文地图中,将显示功能应用于列表中的每个报告。结果应类似于 [show report0, show report1,... ,show reportn]

换句话说,你传递一个报表列表和函数映射,映射列表中每个报表类型的项目显示函数。

您的功能的构建方式对应于无点样式

于 2013-02-14T17:17:57.390 回答