/ / Друк проміжного значення в рекурсивній функції в Haskell - haskell, рекурсія

Друк проміжного значення в рекурсивній функції в Haskell - haskell, rekursion

Я новачок у Хаскелі і хочу навчитися цьому. Я хочу надрукувати проміжне значення в рекурсивній функції в 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 для відповіді № 1

Як говорить PyRulez у своєму коментарі, вам потрібно використовувати let синтаксис у блоках do. Однак ви також зіткнетеся з проблемами, оскільки параметри вашої функції, як і всі значення в Haskell, незмінні. Вам потрібно буде зробити щось на зразок:

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

2 для відповіді № 2

Якщо ви хочете надрукувати лише якесь проміжне значення, вам не потрібно мати свою функцію у світі вводу-виводу: Ви можете використовувати модуль 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