【问题标题】:In Haskell, what does the map function mean when you only pass it a list?在 Haskell 中,当你只传递一个列表时,map 函数意味着什么?
【发布时间】:2013-02-14 16:46:32
【问题描述】:

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

例如

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

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

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

【问题讨论】:

  • 另外,应用的参数是一个函数,而不是一个列表。 map(a -> b) -> [a] -> [b](a -> b) -> ([a] -> [b]) 相同。
  • 您可以将f . g . h 读作“管道”,它获取数据并通过h,然后是g,然后是fmap show 是管道中的函数之一(它接受一个列表并将列表中的每个元素转换为流)

标签: haskell map parameters pointfree partial-application


【解决方案1】:

地图类型:

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

所以你必须提供一个从ab 的函数和一个a 类型的列表。

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

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

【讨论】:

    【解决方案2】:

    正如其他人所说,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
    

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

    【讨论】:

    • 它们是等价的,因为它们都给出相同的结果。在某些情况下,它们的性能可能不同,如果没有类型签名,可怕的单态限制可能会导致问题。但它们在最重要的方面是等价的。
    【解决方案3】:

    根据经验,如果您有类似的情况...

    foo = bar . foobar . blafasel
    

    ...您可以用$ 替换点并在两边添加一个变量

    foo x = bar $ foobar $ blafasel x
    

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

    【讨论】:

      【解决方案4】:

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

      换个说法,你传递一个报表列表和函数map,ma​​p为列表中的每一项报表类型显示函数。

      您的函数的构建方式对应于point free style

      【讨论】:

        猜你喜欢
        • 2022-11-27
        • 2014-12-26
        • 1970-01-01
        • 2015-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多