码迷,mamicode.com
首页 > 其他好文 > 详细

F# 学习笔记(函数基础)

时间:2015-07-02 22:29:14      阅读:645      评论:0      收藏:0      [点我收藏+]

标签:

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

函数定义上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 // 返回整数退出代码

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

 

F# 学习笔记(函数基础)

标签:

原文地址:http://www.cnblogs.com/qugangf/p/4617156.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!