Eu sou novo em Haskel e quero aprender. Eu quero imprimir valor intermediário na função recursiva no haskell, mas eu estou preso em erro de análise na entrada "=" na linha 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 `
o equivalente C para este código é
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;
}`
Por favor me ajude a resolver esse problema. Não é tão difícil de fazer em C, mas não consegui descobrir como fazê-lo em Haskel.
Respostas:
2 para resposta № 1Como PyRulez diz em seu comentário, você precisa usar let
sintaxe em blocos do. No entanto, você também vai encontrar problemas porque seus parâmetros de função, como todos os valores no Haskell, são imutáveis. Você precisará fazer algo como:
let b" = b + 5
let c" = b" + 2 * a
2 para resposta № 2
Se você quiser apenas imprimir algum valor intermediário, você não precisa ter sua função no mundo de IO: você pode usar o módulo 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)
isso me dá:
> 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