你的位置:首页 > ASP.net教程

[ASP.net教程]F# 学习笔记(函数基础)


因为只是笔记,所以只记录自己觉得要注意与需要理解的地方,其他就不记了

函数定义上F#有自己的写法:

[<EntryPoint>]let main argv =   let f1 = fun x -> x * x - 2 * x  let f2 x =     let x1 = x - 2    x * x1  printfn "%i" (f2 10)  printfn "%i" (f1 10)  0 

f1是很好理解的,因为基本上现在支持lambda表达式的基本都是第一种写法,只是默认给推断了返回值

f2省略了func 与-> 符号,第一眼看起来不好理解,其实这2个函数是一样的。

如果函数有多个参数,类型会有所不同,这里我在控制台里试了一下:

> let g2 x y z = 1.0 + x*x + y*y + z*z;;val g2 : x:float -> y:float -> z:float -> float

发现它的类型是curry化的,测试了一下果然是这样:

[<EntryPoint>]let main argv =   let g2 x y z = 1 + x + y + z  let a = g2 10  let b = a 11  let c = b 12  printfn "%i" c  0 // 返回整数退出代码

使用ref引用型参数传递值:

[<EntryPoint>]let main argv =   let a1,b1 = ref 6, ref 9  let rChange ref x y =     let t = !x    x := !x + !y    y := !y - t    (x,y)  let z2 = (rChange ref a1 b1)  let c,d = z2  printfn "%i" (c.Value)    0 // 返回整数退出代码

参数前置与函数复合,这里计算f(x) = 2乘以x的平方+3 ,g(x) = 根号x/2计算 g(f(x))

[<EntryPoint>]let main argv =   let f x = 2.0*x*x + 3.0  let g x = sqrt (x/2.0)  let y = g (f 3.0)  let d = 3.0 |> f |> g  printfn "%f" y  printfn "%f" d  0 // 返回整数退出代码

  let y = g (f 3.0)这里使用复合函数,可以使用管道符将参数前置: let d = 3.0 |> f |> g

在前面所定义的函数都是被curry的,所以不能使用多个参数做前置,如果想使用多个参数前置,应该做如下定义,

[<EntryPoint>]let main argv =   let f2 = fun(a,b) -> a*a + b*b  let g1 x = x * (x-1)  let y1 = (3,4) |> f2 |> g1  0 // 返回整数退出代码

f2 的定义就是一个常规函数定义,2个参数没有被分开,而curry化的函数,是高阶函数,用scala的定义法就是这样def first(x: Int) = (y: Int) => x + y

运算符做为函数:

[<EntryPoint>]let main argv =   let a1 = (+) 2 5  let a2 = (*) 3 4  printfn "%i" a1  printfn "%i" a2  0 // 返回整数退出代码

使用前缀运算符,就是把+作为函数来使用