代码之家  ›  专栏  ›  技术社区  ›  Kyle

尝试用if跟踪函数

  •  0
  • Kyle  · 技术社区  · 6 年前
    expmod :: Integer -> Integer -> Integer -> Integer
    expmod a n m | trace (show (a n m)) False = undefined
    expmod a 0 m = 1
    expmod a n m = let (q,r) = divMod n 2
                   ans = expmod a q m
               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
    

    我不知道为什么它在if语句中失败了

    error: parse error on input `if'
       |
    37 |                if (r == 0) then let ans = ans*ans `mod` m
       |                ^^
    

    如何跟踪具有if语句的函数?

    1 回复  |  直到 6 年前
        1
  •  5
  •   Chai T. Rex    6 年前

    眼前的问题

    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 $ 如果箭头很重要的话。

    推荐文章