[英]foldr returning a list in Haskell
我正在閱讀本指南,並了解返回數字時文件foldr
工作方式。
sum' :: (Num a) => [a] -> a
sum' xs = foldl (\acc x -> acc + x) 0 xs
ghci> sum' [3,5,2,1]
11
現在,我需要使用foldr
返回列表,並且無法運行此代碼。
map' :: (a -> b) -> [a] -> [b]
map' f xs = foldr (\x acc -> f x : acc) [] xs
我不知道f
應該是什么。
也許這可以幫助:
map' succ [1,2,3]
= foldr (\x acc -> succ x : acc) [] [1,2,3]
= foldr (\x acc -> succ x : acc) [] [1,2,3]
= (\x acc -> succ x : acc) 1 (foldr (\x acc -> succ x : acc) [] [2,3])
= succ x : acc where x=1 ; acc=foldr (\x acc -> succ x : acc) [] [2,3]
= succ 1 : foldr (\x acc -> succ x : acc) [] [2,3]
= succ 1 : (\x acc -> succ x : acc) 2 (foldr (\x acc -> succ x : acc) [] [3])
= succ 1 : succ 2 : foldr (\x acc -> succ x : acc) [] [3]
= succ 1 : succ 2 : (\x acc -> succ x : acc) 3 (foldr (\x acc -> succ x : acc) [] [])
= succ 1 : succ 2 : succ 3 : foldr (\x acc -> succ x : acc) [] []
= succ 1 : succ 2 : succ 3 : []
= 2 : 3 : 4 : []
= [2,3,4]
看一下類型:
map' :: (a -> b) -> [a] -> [b]
map' f xs = ys where ys = ...
f
是類型a -> b
的函數:
f :: a -> b
f x = y where y = ...
意思是,給定類型a
的x
,它會產生類型b
的y
。 因此map' f
的類型為[a] -> [b]
,
map' :: (a -> b) -> [a] -> [b]
map' f xs = ys where ys = ...
map' f :: [a] -> [b]
也就是說,給定類型為[a]
的列表xs
,它將產生類型為[b]
的列表ys
。
所以,無論f
你使用,它必須與列表xs
與您打算使用map' f
:它必須接受的元素xs
作為參數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.