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