在Haskell中以递归函数打印中间值

时间:2015-12-01 23:01:16

标签: haskell recursion

我是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中做到这一点。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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