我只是尝试遍历列表并返回每个元素。
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
答案 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
。 : - )