【问题标题】:Isn't map takes a function and a list return a list?map 不是接受一个函数,一个列表返回一个列表吗?
【发布时间】:2018-08-03 22:41:13
【问题描述】:
map2_List :: (a -> b -> c) -> [a] -> [b] -> [c]
map2_List f [] _ = []
map2_List f (a:as) bs = map (f a) bs ++ map2_List f as bs

这是我讲座中的一个示例,它尝试将二进制函数应用于两个列表的所有元素对。 (f a) 部分让我很困惑。它是否假设是一个值而不是一个函数?那么map value bs 是做什么的呢?

【问题讨论】:

  • 仔细查看类型。 fa -> b ->c 类型,所以 f ab -> c 类型的值。
  • 哇,明白了,谢谢!

标签: haskell higher-order-functions map-function partial-application


【解决方案1】:

(f a) 的部分让我很困惑。”

这里发生的事情称为currying,如果您是从命令式语言开始使用 Haskell,那可能会令人困惑。

在 Haskell 中,从技术上讲,所有函数都采用单个值并返回单个值。返回值可能是另一个函数。大多数程序员都采用思维捷径,认为函数采用其定义中的所有值(术语“饱和”顺便说一句)并产生最终值,但即使使用这种思维捷径,很多时候,像这样,当事实并非如此。

函数f 是二元函数,(f a) 是该函数部分应用(f a) :: b -> c 的类型。

“那map value bs做了什么?”

map 函数 (map :: (a->b) -> [a] ->[b]) 是标准前奏的一部分。它采用一个简单的函数并将其应用于列表中的每个元素。

所以让我们把map (f a) bs分开:

  • map :: (b->c) -> [b] ->[c] 将函数应用于列表的每个元素
  • (f a) :: b -> c 使用 currying 函数 f :: a -> b -> c 应用于 a 并返回函数 b -> c
  • bsmap2_List 的第二个列表
  • 此函数的结果是[c],函数f 应用于第一个列表的一个元素,然后应用于第二个列表的每个元素。

【讨论】:

    猜你喜欢
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 2010-10-20
    相关资源
    最近更新 更多