为什么递归值为null?

Cha*_*Sun 10 f#

我是F#初学者,在学习“递归值”时遇到了这个问题。

type Type = 
    | N of int * Type
    | E

let rec a = N(2, b)
and b = N(3, E)

a |> printfn "%A"
Run Code Online (Sandbox Code Playgroud)

希望输出是:

N(2, N(3, E))
Run Code Online (Sandbox Code Playgroud)

但实际输出为:

N (2,null)
Run Code Online (Sandbox Code Playgroud)

输出

Fyo*_*kin 10

这实际上是F#编译器中的错误,在此处提交:https : //github.com/fsharp/fsharp/issues/847

没有关于何时(或是否)将其修复的指示。

对于您的特定示例,我建议您仅删除rec修饰符:由于值实际上不是递归的,因此不需要它。这将使错误消失。

对于更一般的情况,您可以创建一个相互递归函数的系统进行初始化,也可以创建一个嵌套let块。例如,这应该工作:

let a, b =
    let rec a = N(2, b)
    and b = N(3, E)
    a, b
Run Code Online (Sandbox Code Playgroud)