来自 C 系列语言(C#、Java、C、C++、JavaScript)的人们似乎在理解 F# 中括号的使用时遇到问题。我当然有,而且我花了几年时间才了解事情是如何运作的。
简而言之,F# 中最基本的构建块是value。值可以是let
-bound:
let foo = bar
这意味着foo
是一个值,恰好等于bar
.
函数也是值:
// 'a -> 'a * 'a
let f = fun x -> x, x
Here, f
是一个带有一些值的函数(x
) 并返回一个元组x
作为第一个和第二个元素。
写起来有点麻烦,所以有一个简写:
// 'a -> 'a * 'a
let f x = x, x
请注意,这些表达式中没有括号。
有时您需要调整运算符的优先级。就像数学一样,1 + 2 * 3
(这相当于1 + (2 * 3)
) 不等于(1 + 2) * 3
。在 F# 中,您还可以使用括号来覆盖优先级。因此
// 'a -> string * 'a
let f x = someOtherFunction x, x
不等于
// x:'a -> string
let f x = someOtherFunction (x, x)
(在这种情况下,someOtherFunction
是一个返回 a 的函数string
.)
请注意,括号并不表示函数调用;而是表示函数调用。它们只是为了控制评估顺序。
有时,您想要定义一个不接受任何输入的函数。但是,您不能这样定义它:
let f = whatever
因为这将使它成为value那就是立即let
-势必whatever
。相反,您可以让函数采用内置类型的值unit
。该类型只有一个值,写为()
:
let f () = whatever
这意味着f
是一个函数模式匹配它的输入与唯一已知的值unit
.
每当你调用f
with ()
, 表达方式whatever
被评估并返回。