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

Cod*_*ein 3 parameters haskell map partial-application pointfree

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

例如

printReports :: [Report] -> IO ()
printReports = putStrLn . unlines . map show
Run Code Online (Sandbox Code Playgroud)

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

map在这种情况下意味着什么/做什么?

kaa*_*aan 10

地图类型:

map :: (a -> b) -> [a] -> [b]
Run Code Online (Sandbox Code Playgroud)

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

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

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


mhw*_*bat 10

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

printReports xs = (putStrLn . unlines . map show) xs
Run Code Online (Sandbox Code Playgroud)

或者,等效地,

printReports xs = putStrLn . unlines . map show $ xs
Run Code Online (Sandbox Code Playgroud)

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

myFunction x y z = someExpression x y z
myFunction x y = someExpression x y
myFunction x = someExpression x
myFunction = someExpression
Run Code Online (Sandbox Code Playgroud)

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

  • 它们是等价的,因为它们都给出了相同的结果.在某些情况下,它们的性能可能不同,如果没有类型签名,则可怕的单态限制可能会导致问题.但它们在最重要的方面是等同的. (6认同)