user5627838
user5627838

Reputation: 11

Printing intermediate value in recursive function in Haskell

I am new to Haskel and want to learn it. I want to print intermediate value in recursive function in haskell but i am stuck in parse error on input "=" on line 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 `

the C equivalent for this code is

 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;  
    }`

Please help me to resolve this problem. It is not so difficult to do in C but I could not figure out how to do it in Haskel.

Upvotes: 1

Views: 595

Answers (2)

dchagniot
dchagniot

Reputation: 61

If you only want to print some intermediate value, you don't need to have your function in the IO world: you can use the Debug.Trace module:

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)

it gives me:

> 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

Upvotes: 2

T Burnside
T Burnside

Reputation: 121

As PyRulez says in his comment, you need to use let syntax in do blocks. However, you are also going to run into issues because your function parameters, like all values in Haskell, are immutable. You will need to do something like:

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

Upvotes: 2

Related Questions