如何防止急切的评价?

时间:2014-11-17 14:36:21

标签: 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

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

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

1 个答案:

答案 0 :(得分:4)

问题是您没有定义功能,而是

在F#中编写以下内容时:

let test =
  printfn "Hi"

...您正在定义一个值test,其类型为unit(类似于C#中的void),会立即对其进行求值,并将表达式的结果存储在名为test的值。表达式的结果是unit值(您无法做多少),但它是一个有效值。

另一方面,当你写:

let test () =
  printfn "Hi"

...您正在定义一个函数unit -> unit,仅在您调用它时进行评估(然后打印&#34;嗨&#34;并返回unit值作为结果) 。要调用该函数,您还需要编写test ()(使用单位值作为参数)而不仅仅是test(它指的是函数,但不会调用它)。 / p>

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

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