Haskell 有人能给我解释一下哈斯克尔函数吗
我在网上找到了一个解决方法,但我不确定是什么。结果是正确的Haskell 有人能给我解释一下哈斯克尔函数吗,haskell,fold,Haskell,Fold,我在网上找到了一个解决方法,但我不确定是什么。结果是正确的 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的
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]:
如果因为这是家庭作业而不允许使用map,那么可能也不允许使用foldr。使用foldr将列表中的每个元素乘以10是一种相当愚蠢的方法,除了作为学习练习。一般来说: 如果您想对列表中的每个元素执行某些操作,并得到一个列表作为结果,那么您可能需要某种映射函数。 如果要对列表中的每个元素执行某些操作,并得到一个值作为结果,那么可能需要一个fold函数。 让我们编写自己的函数。函数将获取一个数字列表,并返回一个列表。如果要使用Ints,请执行以下操作: 更好的是,不用在10中硬编码,可以将其作为输入参数。我把它作为练习留给你 我们可以使用递归来实现这个函数。当使用递归时,首先问问自己最简单的基本情况是什么。嗯,那将是一个空列表。如果我们得到一个列表,没有什么可做的,所以我们只返回空列表
myFunction [] = []
现在,如果我们的列表不是空的呢?我们可以将第一个元素乘以10,并将其与在列表的其余部分上运行myFunction的结果连接起来
myFunction (x:xs) = x*10 : myFunction xs
如果要将每个元素列表乘以10,为什么不映射*10?说明中说我不能使用它。只使用lambda表达式和foldr,即不映射或筛选,编写一个函数,将列表中的每个元素乘以10。链接到问题的根源。你所拥有的不是一个完整的问题陈述。
myFunction [] = []
myFunction (x:xs) = x*10 : myFunction xs