因为只是笔记,所以只记录自己觉得要注意与需要理解的地方,其他就不记了
函数定义上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 // 返回整数退出代码
使用前缀运算符,就是把+作为函数来使用