我想定义这个函数:
accumulate_list' :: Num a => [a] -> ( a -> a -> a ) -> a
accumulate_list' l f
| [] f = 0
| (x:xs) f = f x (accumulate_list xs f)
但是它无法编译,抱怨x、xs、x、xs不在作用域内。
为了达到相同的结果,我定义了这个函数
accumulate_list :: Num a => [a] -> ( a -> a -> a ) -> a
accumulate_list [] f = 0
accumulate_list (x:xs) f = f x $ accumulate_list xs f
它编译得很好,如果传递的函数是(+)
,则像列表上的sum
函数一样工作。是的,我终于发现,我想要实现的内容已经作为Prelude中的sum
函数存在。
然而,我不明白为什么带有混合守卫和模式匹配的第一个版本无法编译。问题出在哪里?
accumul l f = case l of [] -> 0; (x:xs) | 5 < 10 -> ...; ...
这段代码,它实际上将模式匹配与守卫混合在一起。 - Will Ness