F#教程: 无参函数和for语句


我们继续调查和学习函数。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就被忽略了。

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


« 
» 
快速导航

Copyright © 2016 phpStudy | 豫ICP备2021030365号-3