在我调试的Haskell项目中,代码中有一些实例,map
只使用一个参数 - 一个列表 - 被传递。
例如
printReports :: [Report] -> IO ()
printReports = putStrLn . unlines . map show
和
printRuns' :: [Run] -> IO ()
printRuns' = putStrLn . unlines . map showRecipes'
map
在这种情况下的意思/做法是什么?
答案 0 :(得分:10)
地图类型:
map :: (a -> b) -> [a] -> [b]
因此,您必须提供从a
到b
的功能以及类型a
的列表。
在您的示例中,该功能已经提供(show
和showRecipes'
),因此,您只需提供printReports
和printRuns'
列表。< / 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相对应。