Haskell只需遍历列表

时间:2018-03-30 11:13:52

标签: list haskell iteration

我只是尝试遍历列表并返回每个元素。

iterateList [] =  error "empty list"
iterateList [a] = a
iterateList (x:xs) = x iterateList xs

在第三行,我尝试返回第一个元素,然后在List的尾部递归调用iterateList

但那不起作用。知道为什么吗?

实施例: 输入:iterateList [1,2,3,4,5] 输出:1 2 3 4 5

1 个答案:

答案 0 :(得分:1)

  

我想要的只是Java中for循环的例子,我可以对列表中的每个元素做一些事情,比如打印,求和,乘法,删除,只是访问这些元素

嗯,你不能删除" Haskell中的任何内容,您都无法修改绑定。你可以做的是例如总结要素:

sumList [] = 0
sumList (x : xs) = x + sumList xs

或乘以元素:

productList [] = 1
productList (x : xs) = x * productList xs

此时你可能会发现自己已经重复了很多次,这很烦人。您可以提取公共部分并将差异转换为参数:

iterateList f z [] = z
iterateList f z (x : xs) = x `f` iterateList f z xs

sumList     = iterateList (+) 0
productList = iterateList (*) 1

此处z代表"基值"要为空输入列表返回,f是"合并"函数告诉它如何处理元素和列表的其余部分。

打印有点复杂,因为您必须首先了解IO的工作原理(特别是,您应该了解>>return),但仍可以这样做:

doNothing           = return ()
printAndThen x rest = print x >> rest

printList = iterateList printAndThen doNothing 

...或直接使用值而不是首先将它们绑定到名称:

printList = iterateList (\x rest -> print x >> rest) (return ())

最后你会意识到你刚刚彻底改造了foldr。 : - )