map 不是接受一个函数和一个列表 return 一个列表吗?

Isn't map takes a function and a list return a list?

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有什么作用呢?

"The part (f a) makes me confused."

这里发生的事情称为 currying,如果您是从命令式语言转向 Haskell,它可能会造成混淆。

在 Haskell 中,所有函数在技术上都取一个值,return 取一个值。 returned 值 可能 是另一个函数。大多数程序员都采取思维捷径来思考函数在其定义中获取所有值(术语是 "saturated" BTW)并产生最终值,但即使使用这种思维捷径,也有很多时候,像这样,当情况并非如此。

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

"Then what does map value bs do?"

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 和 returns 函数 b -> c
  • bsmap2_List
  • 中的第二个列表
  • 此函数的结果是 [c],函数 f 应用于第一个列表的一个元素,然后应用于第二个列表的每个元素。