前言:最近在了解F#,无意中看到一个日文的教程(http://techbank.jp/Community/blogs/gushwell/default.aspx),觉得很不错,所以希望可以和大家一起分、学习。

我们继续调查和学习函数。FunctionSample的函数定义如下:
#light
let FunctionSample() =
        let even n = (n % 2 = 0)
        for i = 0 to 10 do
                printfn "Is %d even? %b" i (even i)
FunctionSample()

其中,最后一行是FunctionSample的函数调用。
这个代码中有几点没有说明过的但需要注意的:
■第1点
函数中定义了even函数。函数中嵌套了子函数。
■第2点
函数的作用域通过缩进决定。不要用和C#类似的{}指定。
■第3点
F#中可以使用for语句。
i = 0 to 10语句中,包含了10。
for语句的作用域通过缩进决定。
有了for就放心些了,毕竟Haskell中没有。
■第4点
可以定义不返回任何东西的函数。FunctionSample函数就是不返回任何东西的函数。
顺便说下,选择函数部分后,通过Alt + Enter启动F# Interactive就可以看到:
val FunctionSample : unit -> unit
unit是什么呢?调查后,发现这和C#的void类似。
■第5点
无参函数定义时候需要加上()。调用的时候也需要加上()。
试着省掉()后,执行如下改写后的代码:
#light
let FunctionSample =
        let even n = (n % 2 = 0)
        for i = 0 to 10 do
                printfn "Is %d even? %b" i (even i)
printfn "-------"
FunctionSample

输出结果在"-------"之前的部分如下:
Is 0 even? true
Is 1 even? false
...

也就是说没有()的话,FunctionSample就变成了变量。变量FunctionSample的类型是unit(或者说是void):
val FunctionSample : unit

不过记着F#可以干这样的事。
没有带()的函数的定义方法很多,就一起试试吧:
#light
let FunctionSample _ =
        let even n = (n % 2 = 0)
        for i = 0 to 10 do
                printfn "Is %d even? %b" i (even i)
FunctionSample()

上述代码是OK的。_(下划线)就是想忽略输入参数时利用的符号。
这里,函数声明是:
val FunctionSample : 'a -> unit

严格说来,和带有()的函数是不一样的。'a就是C#泛型参数。
调用的代码如下:
FunctionSample 10

其中,输入参数10就被忽略了。

本来很短的实例代码,却出乎意料地唠叨了这么多!