我在互联网上找到了锻炼的解决方案,但不确定是什么。结果是正确的。
foldr (\n acc -> (n*10):acc) []
有人可以向我确切说明该功能的步骤吗?这应将列表的所有元素乘以10。
谢谢
该foldr
函数可以定义如下:
foldr :: (a -> b -> b) -> b -> [a] -> b
foldr f z [] = z
foldr f z (x:xs) = f x (foldr f z xs)
它需要一个类型的值列表a
和一个类型的单个值b
–累加器。它从列表中取出项目,将它们与累加器组合在一起并返回最终值。在您的情况下,a
是一个数字,b
实际上也是一个数字列表。您的函数的完整类型为Num a => [a] -> [a]
。
考虑将函数应用到列表中[1,2,3]
:
foldr (\n acc -> (n*10):acc) [] [1,2,3] ~~>
(\n acc -> (n*10):acc) 1 (foldr (\n acc -> (n*10):acc) [] [2,3]) ~~>
(1*10) : foldr (\n acc -> (n*10):acc) [] [2,3] ~~>
10 : foldr (\n acc -> (n*10):acc) [] [2,3] ~~>
10 : (\n acc -> (n*10):acc) 2 (foldr (\n acc -> (n*10):acc) [] [3]) ~~>
10 : (2*10) : foldr (\n acc -> (n*10):acc) [] [3]
10 : 20 : foldr (\n acc -> (n*10):acc) [] [3] ~~>
10 : 20 : (\n acc -> (n*10):acc) 3 (foldr (\n acc -> (n*10):acc) [] []) ~~>
10 : 20 : (3*10) : foldr (\n acc -> (n*10):acc) [] [] ~~>
10 : 20 : 30 : foldr (\n acc -> (n*10):acc) [] [] ~~>
10 : 20 : 30 : []
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句