在Haskell中使用filter函数实现返回整数n所有约数的功能
问题原因分析
你当前代码出错的核心是filter函数的参数传递不符合要求:
filter的类型为filter :: (a -> Bool) -> [a] -> [a],仅接受两个入参:第一个是用于判断元素是否保留的单参数函数,第二个是待过滤的列表。- 你写的
filter divides n [1..n]相当于给filter传入了三个参数(divides、n、[1..n]),类型匹配失败自然无法运行。
修正方案
你的divides函数参数顺序刚好适配部分应用的场景:divides接受两个参数x、y,判断y是不是x的约数。只需要把第一个参数固定为n,就能得到一个单参数判断函数divides n,刚好可以作为filter的第一个参数:
divisors n = filter (divides n) [1..n]
额外优化建议
你现有的divides函数可以简化,不需要额外写守卫分支:比较运算==本身就会返回Bool值,直接返回比较结果即可:
divides x y = mod x y == 0
内容的提问来源于stack exchange,提问作者33lives
相关产品推荐
相关产品推荐

