[英]Explanation of map functions (using foldr) in Haskell?
我正在嘗試使用 foldr 定義 map function
我找到了以下兩個解決方案,但是我不太確定它們是如何工作的。
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 -> fx: xs)
做什么。
我也不明白 foldr 如何處理空列表的情況。
如果我能用外行的方式簡單地一步一步地解釋這一點,將不勝感激。
(\x xs -> fx: xs)
和(:). f
(:). f
意思相同。 它們都是采用兩個 arguments 的函數,將f
應用於第一個參數,然后將其應用於第二個參數。
那么當給定一個空列表時, foldr
會做什么呢? 它只是返回起始值,在這些示例中為[]
。
這是來自Hackage的foldr
的實現:
foldr k z = go
where
go [] = z
go (y:ys) = y `k` go ys
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.