2013-02-14 28 views
3

在一个Haskell项目中,我给出了调试,代码中有map只有一个参数 - 一个列表 - 被传递。在Haskell中,当您只将它传递给列表时,map函数意味着什么?

例如

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

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

是什么map平均/做到在这种情况下?

+1

http://www.haskell.org/haskellwiki/Partial_application – 2013-02-14 16:50:57

+2

此外,应用的参数是一个函数,而不是一个列表。 'map'是与[(a - > b) - >([a] - > [b])'相同的(a - > b) - > [a] - > [b]''。 – 2013-02-14 16:51:19

+1

你可以阅读'f。 G 。 h“作为”管道“,它接收数据并通过'h',然后'g',然后'f'传递数据。 'map show'是管道中的一个函数(它需要一个列表并将列表中的每个元素转换为一个流) – luqui 2013-02-15 10:02:12

回答

10

地图类型:

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

所以,你必须提供从ab功能和a类型的列表。

在你的例子,该功能已经给出(showshowRecipes'),因此,您只需要为printReportsprintRuns'列表。

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

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 

这是一个轻微的过于简单化,但它会让你开始。

+6

它们是相同的,它们都具有相同的结果。在某些情况下,它们的性能可能会有所不同,而如果没有类型签名,可怕的单态限制可能会导致问题。但它们在最重要的方面是相同的。 – 2013-02-14 17:24:05

2

在此上下文中,将show函数应用于列表中的每个报告。 结果应该看起来像[秀report0,显示报告1,...,显示reportn]

说不同的传递报告的列表,功能地图,地图在列表类型的报告的每个项目显示功能。

您的功能建立的方式对应于point free style

3

作为一个经验法则,如果你有这样的事情......

foo = bar . foobar . blafasel 

...您可以通过精神上替代$点及两侧

foo x = bar $ foobar $ blafasel x 

为什么这部作品在其他的答案已经说明添加变量,但这一招可以帮助我读免费点风格没有太多的想法。

相关问题