如何防止渴望评估?

Vla*_*lad 1 f#

我正在尝试一些经常使用printfn的示例。我创建了一个控制台应用程序,但是无论是否调用它们,所有功能都会输出其输出。我相信渴望评估的背后是我的错误。这是我的代码:

TextFormat.fs:

module TextFormat

    let printPi =
        let pi = System.Math.PI
        printfn "float: %f, exponent: %e, compact: %g" pi pi pi

        let petabyte = pown 2.0 50
        printfn "float: %f, exponent: %e, compact: %g" petabyte petabyte petabyte

    let printDecimal =
        let largeM = 123456789.123456789M
        printfn "float: %f, decimal: %M" largeM largeM

    let RunExamples () =
        do printDecimal
Run Code Online (Sandbox Code Playgroud)

Program.fs:

open TextFormat

let exit () =
    printfn ""
    printfn "Press any key to exit"
    System.Console.ReadLine() |> ignore

[<EntryPoint>]
let main argv = 
    RunExamples()

    exit()
    0 // return an integer exit code
Run Code Online (Sandbox Code Playgroud)

如何强制我的程序仅打印我想要的行?

Tom*_*cek 5

问题在于您不是在定义函数,而是在定义

在F#中编写以下代码时:

let test =
  printfn "Hi"
Run Code Online (Sandbox Code Playgroud)

...您正在定义一个test类型unit(类似于voidC#)的值,该值会立即求值,并且表达式的结果存储在名为的值中test。表达式的结果是一个unit值(您不能做太多事情),但这是一个有效值。

另一方面,当您编写时:

let test () =
  printfn "Hi"
Run Code Online (Sandbox Code Playgroud)

...您正在定义一个unit -> unit仅在调用该函数时才对其求值的函数(然后该函数打印“ Hi”并返回一个unit值作为结果)。要调用该函数,您还需要编写test ()(使用单位值作为参数)而不是仅仅编写(test引用该函数,但不调用它)。

因此,在您的示例中,您需要添加一个参数,例如:

let printPi () =
    let pi = System.Math.PI
    printfn "float: %f, exponent: %e, compact: %g" pi pi pi

    let petabyte = pown 2.0 50
    printfn "float: %f, exponent: %e, compact: %g" petabyte petabyte petabyte
Run Code Online (Sandbox Code Playgroud)