繁体   English   中英

F#:为什么我必须为不带参数的函数明确指定'unit'?

[英]F#: Why do I have to explicitly specify 'unit' for functions taking no arguments?

所以我刚刚完成了我的第一个F#程序,我唯一的功能背景是对Haskell 的一点知识(读:没有真正生成任何程序)。

在经历了一些令人难以置信的行为后,我开始意识到F#区分了:

prepareDeck = allSuits |> List.collect generateCards |> shuffle

prepareDeck() = allSuits |> List.collect generateCards |> shuffle

我注意到它“缓存”了前者,如果再次调用则不会重新计算它,而它将后者视为正常函数。 如果有问题的功能没有副作用,你无法区分,显然,但是我的shuffle了!

这应该是常识吗? 我还没有在任何教程材料上看到它。 原因只是解析器中的一个弱点,有点像你在使用它之前必须声明一个函数?

大多数F#材料确实解释了模块中的所有顶级语句都是从声明自上而下执行的。 换句话说,您声明的不是函数,而是程序运行时绑定一次的值。

查看反映的代码确实很有帮助。 我有一个简单的文件:

let juliet = "awesome"
let juliet2() = "awesome"

编译后的代码如下所示:

public static string juliet
{
    [CompilerGenerated, DebuggerNonUserCode]
    get
    {
        return "awesome";
    }
}

//...

public static string juliet2()
{
    return "awesome";
}

所以一个是静态属性,另一个是函数。 这是一个理想的属性,因为想象一下,如果我们有这样的东西:

let x = someLongRunningDatabaseCall()

我们只希望x绑定一次,我们不希望它每次访问x调用数据库函数。

另外,我们可以编写这样有趣的代码:

> let isInNebraska =
    printfn "Creating cities set"
    let cities = set ["Omaha"; "Bellevue"; "Lincoln"; "Papillion"; "La Vista"; "Ralston"]
    fun n -> cities.Contains(n);;
Creating cities set

val isInNebraska : (string -> bool)

> isInNebraska "Omaha";;
val it : bool = true

> isInNebraska "Okaloosa";;
val it : bool = false

由于isInNebraska是一个值,因此立即进行评估。 恰好它的数据类型是(string -> bool) ,所以它看起来像一个函数。 因此,即使我们调用函数1000次,我们也只填充一次设置的cities

让我们将该代码与此进行比较:

> let isInNebraska2 n =
    printfn "Creating cities set"
    let cities = set ["Omaha"; "Bellevue"; "Lincoln"; "Papillion"; "La Vista"; "Ralston"]
    cities.Contains(n);;

val isInNebraska2 : string -> bool

> isInNebraska2 "Omaha";;
Creating cities set
val it : bool = true

> isInNebraska2 "Okaloosa";;
Creating cities set
val it : bool = false

糟糕,我们每次调用函数时都会创建一个新的城市集。

因此,价值观和功能之间肯定存在合理和真实的区别。

这就是几乎每种语言都有副作用的方法。

let name = expr

运行代码'now',如果expr ,可能会导致副作用。 name后续引用没有任何效果。

let name() = expr

定义一个函数,现在没有效果,并且每次调用name()时都会评估(并产生效果)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM