【发布时间】:2020-04-29 12:38:50
【问题描述】:
我正在尝试使用 foldr 定义地图功能
我找到了以下两个解决方案,但我不太确定它们是如何工作的。
map' :: (a -> b) -> [a] -> [b]
map' f = foldr ((:) . f) []
map'' :: (a -> b) -> [a] -> [b]
map'' f = foldr (\x xs -> f x : xs) []
我对 Haskell 和 foldr 还很陌生,所以我很难理解第一个解决方案中的 ((:) . f) 和第二个解决方案中的 (\x xs -> f x : xs) 的作用。
我也不明白 foldr 是如何处理空列表的。
如果我能用外行的术语简单一步一步地解释这一点,将不胜感激。
【问题讨论】:
-
(:) . f和\x xs -> f x : xs是等价的。 -
表达式
\x xs -> f x : xs是lambda expression,(:) . f是它的pointfree 版本。 -
\x xs -> f x : xs == \x xs -> (:) (f x) xs == \x -> (:) (f x) == (:) . f. -
你明白
(:)是做什么的吗?或.?或者什么是 lambda 表达式?或者什么是 lambda 函数?这些都是这个问题的真正先决条件。尝试一次问一个问题。然后是foldr 标签。尝试探索它。维基百科上也有一个页面。尝试查看 stackoverflow.com/tags/haskell/info 以获取学习 Haskell 的资源。
标签: function haskell higher-order-functions