F#构造函数语法

5
使用 .NET 类时,有些情况下我们不需要使用括号来传递单个参数,例如:
let foo = DirectoryInfo "boo"

但是在使用单个参数时,稍微复杂了一些,我们确实需要括号... 有人知道当这种情况发生时的解析规则吗?

1个回答

4
在F#中,所有函数都只接受一个参数。起初可能会有点困惑,因为你可以创建一个看起来接受多个参数的函数,但实际上你传递的是一个元组作为单一参数。
以下是一个简单的构造函数示例,它看起来好像接受了多个参数:
let foo = DirectoryInfo "boo" //passing 1 argument
let foo2 = DirectoryInfo ("boo") //passing 1 argument that is a tuple
let foo3 = StringBuilder ("blah", 100) //passing 1 argument again
let foo4 = StringBuilder "blah" 100 //does not compile

想了解更多有关此样式的信息,请查看MSDN上的元组

现在,还有另一种略有不同的方法,可以让函数看起来像是接受多个参数。这被称为柯里化,当仅处理F#代码时,您会更经常看到它。以下是一个快速示例


1
谢谢回复,我知道圆括号中的元组,但是我发现在某些情况下,.NET类需要用括号将它们的参数括起来,即使只有一个参数,我想这可能是当对象是IDisposable并且我们需要使用new运算符时。所以,像new SomeDisposable(foo)这样的语句就需要括号。 - Alex
我不确定那是准确的。例如,使用 FileSystemWatcher,这个编译是没有问题的: let watcher = new FileSystemWatcher "blah" - wsanville
值得注意的是,许多 F# 代码示例在调用类构造函数时总是使用括号。虽然对于多参数类构造函数来说这是必需的,但在单数情况下这样做会使类构造函数调用看起来像典型的辨别联合构造函数调用形式,在大多数 ML 家族语言中都很常见。 - pblasucci
我总是使用括号,即使是单个参数的构造函数,只为了保持一致。没有必要用特殊情况来复杂化代码,可以避免这种情况。 - Juliet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接