haskell中的同时复发关系

Chr*_*ple 3 haskell

是否有可能在haskell中建立一个同时递归关系的系统?我正在努力实施

a(n)=3a(n-1)+2b(n-1)

b(n) = a(n-1) + 2b(n-1)
Run Code Online (Sandbox Code Playgroud)

输入:

 a n = 3 * a (n-1) + 2 * b (n-1)
Run Code Online (Sandbox Code Playgroud)

输出:

<interactive>:103:25: error: Variable not in scope: b :: t -> a
Run Code Online (Sandbox Code Playgroud)

所以,我不能先定义一个没有定义b,但也不能定义b而不定义第一个.我不确定这样做是否可行?

PS:我在gchi工作

Fyo*_*kin 7

在Haskell中,定义的顺序无关紧要.您可以a在之前bb之前定义a,在这两种情况下,它们可以很好地引用彼此:

a n = 3 * a (n-1) + 2 * b (n-1)
b n = a (n-1) + 2 * b (n-1)
Run Code Online (Sandbox Code Playgroud)

如果你在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| :}
Run Code Online (Sandbox Code Playgroud)

最后,我必须注意这些定义,如所写的,将产生一个无限循环:没有任何情况(即没有输入),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)
Run Code Online (Sandbox Code Playgroud)

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