foldr在Haskell中返回列表
我正在阅读并理解当我们返回一个数字时,foldr在Haskell中返回列表,haskell,lambda,Haskell,Lambda,我正在阅读并理解当我们返回一个数字时,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 :
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' 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' 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' 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
,它都必须对应于要使用map'f
的列表xs
:它必须接受xs
的元素作为参数。查看类型:
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
,它都必须对应于要使用map'f
的列表xs
:它必须接受xs
的元素作为参数。查看类型:
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
,它都必须对应于要使用map'f
的列表xs
:它必须接受xs
的元素作为参数。查看类型:
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
,它都必须对应于您打算使用map'f
的列表xs
:它必须接受xs
的元素作为参数。您知道如何使用map
?那个map'
是普通map
的重新实现,可以用同样的方式使用。你的实际问题是什么?既然你正在阅读指南,你应该知道map
和一般的高阶函数。@Zeta,我只是不明白\x acc->fx:acc
\x acc->fx:acc
的意思是:将f
应用于x
,以及cons
对acc
的回答。因此,如果例如,f
是(+1)
,x
是0
,acc
是[2,3]
,那么f x:acc=>(+1)0:[2,3]=>1:[1,2,3]
@MaksimDmitriev也就是说,并且作为匿名函数运行。你知道如何使用map
?那个map'
是普通map
的重新实现,可以用同样的方式使用。你的实际问题是什么?既然你正在阅读指南,你应该知道map
和一般的高阶函数。@Zeta,我只是不明白\x acc->fx:acc
\x acc->fx:acc
的意思是:将f
应用于x
,以及cons
对acc
的回答。因此,如果例如,f
是(+1)
,x
是0
,acc
是[2,3]
,那么f x:acc=>(+1)0:[2,3]=>1:[1,2,3]
@MaksimDmitriev也就是说,并且作为匿名函数运行。你知道如何使用map
?那个map'
是普通map
的重新实现,可以用同样的方式使用。你的实际问题是什么?既然你正在阅读指南,你应该知道map
和一般的高阶函数。@Zeta,我只是不明白\x acc->fx:acc
\x acc->fx:acc
的意思是:将f
应用于x
,以及cons
对acc
的回答。因此,如果例如,f
是(+1)
,x
是0
,acc
是[2,3]
,那么f x:acc=>(+1)0:[2,3]=>1:[1,2,3]
@MaksimDmitriev也就是说,并且作为匿名函数运行。你知道如何使用map
?那个map'
是普通map
的重新实现,可以用同样的方式使用。你的实际问题是什么?既然你正在阅读指南,你应该知道map
和一般的高阶函数。@Zeta,我只是不明白\x acc->fx:acc
\x acc->fx:acc
的意思是:将f
应用于x
,以及cons
对acc
的回答。因此,如果例如,f
是(+1)
,x
是0
,acc
是[2,3]
,那么f x:acc=>(+1)0:[2,3]=>1:[1,2,3]=>。