地图不是带有函数并且列表返回列表吗?

时间:2018-08-03 22:41:13

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

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会做什么?

1 个答案:

答案 0 :(得分:2)

(f a)部分使我感到困惑。”

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

在Haskell中,所有函数在技术上都采用单个值并返回单个值。返回的值可以是另一个函数。大多数程序员会想到思维捷径,即考虑函数定义中的所有值(术语“饱和” BTW)并生成最终值,但是即使有了这种思维捷径,在很多情况下,并非如此。

函数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应用于第一个列表的一个元素,然后应用于第二个列表的每个元素。