【问题标题】:Printing intermediate value in recursive function in Haskell在Haskell的递归函数中打印中间值
【发布时间】:2015-12-03 23:58:56
【问题描述】:

我是 Haskel 的新手,想学习它。我想在haskell中的递归函数中打印中间值,但是我在输入“=”上的解析错误中陷入困境b = b + 50。

`main' t s a b c  
    | t > s    = 0  
    | otherwise = do 
        print a
        print b
        print c
        b = b + 50
        c = b + 2 * a
        main' (t+1) s (a+1) b c `

此代码的 C 等效项是

 int calculate(t,s,a,b,c)
 {
     printf( "%d,%d,%d",a,b,c);
     if(t > s)
        return 0;
     else
      {
           b = b + 50;
           c = b + 2 * a;
           return calculate (t+1,s,a,b,c);
       }

    }
    int main()
    {
         calculate(0,10,2,6,7);
         return 0;  
    }`

请帮我解决这个问题。在 C 中做起来并不难,但我不知道如何在 Haskel 中做。

【问题讨论】:

  • 请发布您从编译器得到的错误
  • 在do块中你需要let语法。

标签: haskell recursion


【解决方案1】:

正如 PyRulez 在他的评论中所说,您需要在 do 块中使用 let 语法。但是,您也会遇到问题,因为您的函数参数,就像 Haskell 中的所有值一样,是不可变的。您需要执行以下操作:

let b' = b + 5
let c' = b' + 2 * a

【讨论】:

    【解决方案2】:

    如果你只想打印一些中间值,你不需要在 IO 世界中拥有你的函数: 您可以使用 Debug.Trace 模块:

    import Debug.Trace
    
    func :: Int -> Int -> Int -> Int -> Int
    func 0 _ _ _ = 0
    func t a b c = trace ("a="++(show a)++" b="++(show b)++" c="++(show c)) $ recurs
        where recurs = func (t-1) (a+1) (b+50) (b+2*a)
    

    它给了我:

    > func 5 1 1 1
    a=1 b=1 c=1
    a=2 b=51 c=3
    a=3 b=101 c=55
    a=4 b=151 c=107
    a=5 b=201 c=159
    

    【讨论】:

      猜你喜欢
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 2021-02-10
      • 1970-01-01
      • 1970-01-01
      • 2011-02-14
      • 2019-02-28
      • 1970-01-01
      相关资源
      最近更新 更多