haskell中的同时复发关系

时间:2017-12-28 17:57:20

标签: haskell

是否可以在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工作

1 个答案:

答案 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| :}

最后,我必须注意,这些定义,如所写的,将产生一个无限循环:没有ab不会递归调用自身的情况(即没有输入) 。这意味着,一旦你打电话给他们,他们就会永远地互相打电话。

要解决此问题,您需要提供一个基本案例 - 输入或一组输入,其中函数不会自行调用,例如:

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)

(我不知道我是否提供了正确的基础案例,因为我不知道你原来的问题是什么,所以不能说你的上下文中的“正确”;我提供的基本案例是只是举例说明如何做到这一点)