Haskell Lambda函数改写问题排查:calcChange返回值异常
Haskell Lambda改写calcChange函数的错误分析与修复
你的问题出在运算符优先级上。Haskell中函数应用的优先级远高于减法运算符,所以你写的代码实际执行顺序是这样的:
calcChange owed given = ((\change -> if change > 0 then change else 0) given) - owed
简单说就是:先把given传入lambda得到结果(如果given>0就返回given,否则返回0),再用这个结果减去owed——这完全偏离了原函数先计算given - owed再判断正负的逻辑。
正确的改写方式
你需要把given - owed作为一个整体传给lambda,只需要给它加个括号即可:
calcChange owed given = (\change -> if change > 0 then change else 0 ) (given - owed)
这样代码会先计算given - owed得到差值,再把这个差值传入lambda做判断,和原函数的逻辑完全一致。
更简洁的写法
其实原函数的逻辑就是取given - owed和0的最大值,你可以直接用max函数简化,lambda写法也能更紧凑:
calcChange = \owed given -> max 0 (given - owed)
内容的提问来源于stack exchange,提问作者pid
相关产品推荐
相关产品推荐

