Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 有人能给我解释一下哈斯克尔函数吗_Haskell_Fold - Fatal编程技术网

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