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
会做什么?
答案 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
bs
是map2_List
[c]
,此函数f
应用于第一个列表的一个元素,然后应用于第二个列表的每个元素。