是否可以在haskell中建立同时复发关系系统?我试图实施
a(n)=3a(n-1)+2b(n-1)
b(n) = a(n-1) + 2b(n-1)
输入:
a n = 3 * a (n-1) + 2 * b (n-1)
输出:
<interactive>:103:25: error: Variable not in scope: b :: t -> a
所以,我不能先定义一个没有定义b,但也不能定义b而不定义第一个。我不确定这样做是否可行?
PS:我在gchi工作
答案 0 :(得分:7)
在Haskell中,定义的顺序无关紧要。您可以在a
之前定义b
或在b
之前定义a
,在这两种情况下,他们可以很好地互相引用:
a n = 3 * a (n-1) + 2 * b (n-1)
b n = a (n-1) + 2 * b (n-1)
如果您在GHCi工作(请澄清),那么是的,它不会单独接受a
的定义,因为它不知道b
是什么。但是,您可以将GHCi的两个定义放在一起,方法是将它们放在:{ ... :}
中,如下所示:
*Prelude> :{
*Prelude| a n = 3 * a (n-1) + 2 * b (n-1)
*Prelude| b n = a (n-1) + 2 * b (n-1)
*Prelude| :}
最后,我必须注意,这些定义,如所写的,将产生一个无限循环:没有a
和b
不会递归调用自身的情况(即没有输入) 。这意味着,一旦你打电话给他们,他们就会永远地互相打电话。
要解决此问题,您需要提供一个基本案例 - 输入或一组输入,其中函数不会自行调用,例如:
a 0 = 1
a n = 3 * a (n-1) + 2 * b (n-1)
b 0 = 1
b n = a (n-1) + 2 * b (n-1)
(我不知道我是否提供了正确的基础案例,因为我不知道你原来的问题是什么,所以不能说你的上下文中的“正确”;我提供的基本案例是只是举例说明如何做到这一点)