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