在F#Are Empty括号用于表示没有参数?

oct*_*bus 2 dll f# parentheses

鉴于此F#库代码

从主要

open FileMaint
let log_file = FileMaint.fm.generate_log_file
Run Code Online (Sandbox Code Playgroud)

来自图书馆

module FileMaint
.
.
.
[<AutoOpen>]
(* return_unique_file_name just returns as close to a unique file name piece based on clock time. *)
module fm =


(* Checks for presense of a file name. *)
    let is_file_present file_name =
        let rc =
            if File.Exists file_name then
                true
            else
                false
        rc

    (* Initialize a log file. *)
    let generate_log_file =
        let log_file_name = 
            if File.Exists(base_log_file) then
                test_and_reset_unique_file_name local_dir base_log_file
            else
                base_log_file

        use fH = new StreamWriter(log_file_name, true)
        fH.WriteLine(generate_time_stamp + ": " + log_file_name + " initialized.")
Run Code Online (Sandbox Code Playgroud)

从我的"主",我可以步入电话is_file_present,但我不能介入,也不会generate_log_file执行.

但是,在generate_log_file像库函数定义括号之后generate_log_file (),然后调用它,函数执行(我可以进入函数).

因此,当函数没有参数时,似乎空括号表示占位符.那是对的吗?

Fyo*_*kin 6

空括号是类型的值unit.此值与任何其他值一样,主要与数字或字符串不同.

let a = 5
let b = "abc"
let c = ()

> val a: int = 5
> val b: string = "abc"
> val c: unit = ()
Run Code Online (Sandbox Code Playgroud)

这种类型unit的特殊之处在于它只有一个值,没有其他值.但在其他方面,它就像任何其他类型.您可以将它用于函数参数,例如:

let f (u: unit) = ...
Run Code Online (Sandbox Code Playgroud)

但是因为它只有一个值,所以可以将值本身用作参数模式:

let f () = ...
Run Code Online (Sandbox Code Playgroud)

您也可以使用其他类型:

let g 42 = ...
let h "abc" = ...
Run Code Online (Sandbox Code Playgroud)

这将编译,但它会给你一个警告,int除了42之外还有其他值,你还没有定义函数应该为它们做什么.但unit除此之外别无其他价值(),因此没有警告.您甚至可以自己制作同等类型:

type T = A
let f A = 42   // no warning here, because A is the only possible value of type T
Run Code Online (Sandbox Code Playgroud)

现在,又回到了你的例子:在你的原代码,generate_log_file是不是功能,而是一个值.它是在初始化期间计算的,当您认为自己正在"调用"它时,您只是引用该预先计算的值.没有打电话,因为没有什么可以打电话.

它是一个值而不是一个函数的原因是它没有任何参数.是的,这是一个简单的规则:如果你有参数,你就是一个功能; 如果没有,你就是一个价值观.所以一旦你给它一个参数,它就变成了一个函数,这就是你可以介入的原因.