眼前的问题
in
与你的
let
expmod a n m = let (q,r) = divMod n 2
ans = expmod a q m
in if r == 0 then let ans = ans*ans `mod` m
in trace ("-->" ++ show ans) ans
else let ans = ans*ans*a `mod` m
in trace ("-->" ++ show ans) ans
附加提示
当你使用
let ans =
,你在定义
ans
答案
右边的等号表示
在等号的左边,不是任何
答案
let ans = ans*ans `mod` m
就像说
let x = x*x `mod` m
不知从哪里冒出来的。它只会给出无限递归,所以对这两个变量使用两个不同的变量名
答案
锿。
traceShowId :: Show a => a -> a
,它跟踪具有
Show
实例。
traceShowId x
x
,所以你可以在你想用的地方用
十
十
. 例如:
expmod a n m = let (q,r) = divMod n 2
ans = expmod a q m
in traceShowId $ if r == 0 then ans*ans `mod` m
else ans*ans*a `mod` m
trace "vvv" . traceShowId $
如果箭头很重要的话。