Haskell中for块内赋值错误求修正:阶乘函数实现问题
修正Haskell阶乘代码的问题
你的代码存在几个关键问题,导致赋值语句报错且逻辑无法实现阶乘计算:
- 自定义
for函数不适合累积计算:你用mapM_实现的for会执行每个动作但丢弃所有结果,无法保存阶乘的累积乘积。 - 循环内变量作用域与逻辑错误:每次循环都重新定义
tmp = 0,完全无法实现从1到n的累积相乘;且tmp <- tmp*i语法错误——tmp*i是纯数值,不是IO操作,不能用<-进行绑定。 - 变量作用域超出范围:最后
return (tmp)中的tmp只在循环的局部do块内有效,外部无法访问,会引发编译错误。
简洁的正确实现
阶乘是纯计算逻辑,没必要用IO循环实现,最简洁的方式是用product函数直接计算列表乘积:
main :: IO () main = do xStr <- getLine let n = read xStr :: Integer factorial = product . enumFromTo 1 -- 等价于 factorial n = product [1..n] print $ factorial n
若想用累积式循环实现
如果需要理解循环累积的逻辑,可以用foldM(带IO的折叠函数)来实现:
main :: IO Integer main = do xStr <- getLine let n = read xStr :: Integer -- foldM 用初始值1遍历列表,每次将累积值与当前元素相乘 foldM (\acc i -> return $ acc * i) 1 [1..n]
内容的提问来源于stack exchange,提问作者Alejandro Caro
相关产品推荐
相关产品推荐

