在范围内相互制作两个功能

时间:2018-02-23 04:43:59

标签: f#

我们如何使两个功能相互了解?例如,在以下代码中,我们如何让pingpong互相呼叫?

module PingPong = 

    let pong = 
        printfn "pong"
        ping 
        // error: The value or constructor 'ping' is not defined.

    let ping = 
        printfn "ping"
        pong

    [<EntryPoint>]
    let main argv = 
        ping
        0

编辑:

自撰写问题以来,我们发现自F#4.1起,现在有module rec个关键字。简单地使用module rec PingPong...意味着在第3行我们收到了这个新错误:

  

错误FS0031:该值最终将作为其自身定义的一部分进行评估。您可能需要使值变为懒惰或函数。价值'pong'将评估'ping'将评估'pong'。

编辑:

在做了更多研究之后,我们学会了价值观和功能之间的区别。我们能够完成以下工作:

module rec PingPong = 

    let pong() = 
        printfn "pong"
        ping() 

    let ping () = 
        printfn "ping"
        pong()

    [<EntryPoint>]
    let main _ = 
        ping()
        0

因此,作为现在可能答案的人的后续问题,在F#4.1引入递归模块之前,我们如何在范围内相互制作两个函数?

1 个答案:

答案 0 :(得分:4)

你可以像这样制作相互递归的定义:

let pong = 
    printfn "pong"
    ping
and ping = 
    printfn "ping"
    pong

但是你的let不具备任何功能。并且您需要将pong标记为rec的递归:

let rec pong x = 
    printfn "pong"
    ping (x + 2)
and ping x = 
    printfn "ping"
    pong (x + 1)

这个程序并不真正&#34;工作&#34;,但它显示了这个概念。这是最终会完成的事情:

let rec pong x = 
    printfn "pong"
    ping (x - 2)
and ping x = 
    printfn "ping"
    match x with
    | 1 -> 1
    | 2 -> 1
    | x -> pong (x + 1)

> pong 5;;
pong
ping
pong
ping
val it : int = 1