【发布时间】:2014-08-25 20:21:45
【问题描述】:
我想定义函数:
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 在列表中所做的那样。是的,我终于发现我想要实现的东西确实已经作为sum函数存在于Prelude中了。
但是,我不明白为什么混合防护和模式匹配的第一个版本无法编译。有什么问题?
【问题讨论】: