簡體   English   中英

文件夾返回Haskell中的列表

[英]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 = ...

意思是,給定類型ax ,它會產生類型by 因此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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM