如果你之前只接触过类C(cpp, java, C#等),你可能很难想象一门语言,没有continue和break,也可能从未听说过柯里化,monad等概念,或许也从未想过,编程语言中还会有单位(量纲)的特性支持。
没错,如果是第一次接触类似的语言,会感觉情报源源不断的涌入大脑,有可能感到一头雾水。 但不要因此退缩,一旦适应了函数式编程的思路,我们将会学到更多的前所未见的思想,那么,让我们开始吧
F#, 与C#一样是.NET平台下的一种编程语言,算是同门师兄弟。
F#,是支持多范式的编程语言,它对函数式编程有着强大的支持
F#,有着强大的类型推断和轻量级的语法
F#,是.NET的一部分,理所当然可以使用.NET现有的环境与生态
F#,常常扮演一个C#语法特性的先驱者的角色,C#有许多的特性,就是从F#这里吸收过来的
让我们从最基础的F#代码开始
let x = 3
let y = 5
let result = x + y
printfn "%d + %d = %d" x y result
F#有强大的类型的自动推断系统...
什么?你说这个C#的var也能做到?我们再看下一个
type Person = { Name: string; Age: int } // 这里定义了一个类型(记录)
let senpei = { Name = "masuda"; Age = 30 }
printfn "Name: %s, Age: %d" senpei.Name senpei.Age
let add x y = x + y // 这里定义了一个函数 入参为x,y
let result = add 25 1
printfn "25 + 1 = %d" result
没错,F#还可以做到直接从构造推理类型,也可以直接通过第一次函数调用推理函数的返回值类型。当然其实还有更多的类型推理模式,这里只是其中简单的一部分
现在让我们把目光聚集到第二个部分,也就是函数的样例。我们把它稍稍一变。
let add x y = x + y
let add25 = add 25
let result = add25 1
printfn "25 + 1 = %d" result
... 啊?这是什么,add函数不是有两个入参吗,怎么第二行只传了一个参数
这就是函数的柯里化(Currying),是一种将多参数入参的函数,转为连续的单参数入参的技术。直观一点的表达就是,
如果有一个函数 f 接受两个参数 x 和 y,在柯里化之后,这个函数可以写成 f(x)(y),其中 f(x) 的返回值是一个新的函数 g(x),而这个 g(x) 再接受参数 y返回最后的结果。
对于参数更多的函数,同理可以继续推理下去
我们再把这个函数简单的变更一下
let add x y = x y
let add25 = add (+)
let result = add25 2 1
....
是不是开始渐渐适应这种惊讶感了。我们开始熟悉函数式编程的一些套路了。其实函数式编程也没有那么遥远,传入运算操作的函数,很有可能在以前学习其他语言的时候,已经作为练习题做过了
没错,在函数式编程语言中,函数就和其他语言的值一样,可以完全不受限制的作为入参,出参,这就是所谓的,第一类值(first-class object)。这里暂不作详细说明,可以理解为F#的函数可操作性可以完全等同于其他函数的int, double这类的数据类型。其实C#的函数也是第一类值(可以作为委托等)但对比F#起来,这个特性显得没有那么强烈。
接下来我们再看一段代码
let val1 = 5
let val2 = if val1 > 10 then 10 else 20
欸?看起来和python好像,不过我们有更好的三元表达式,val1 > 10 ? 10 : 20...
那如果我想再加一些条件呢和分支呢
let val2 =
if val1 > 10 then
10
else if val1 < 0 then
-1
else
val1
哦,表现不错,但我们c#还有switch表达式可以一战...
那如果我们还想加入一些复杂一些的逻辑运算呢
let val1 = 5
let val3 =
let isSquare x =
let sqrt = System.Math.Sqrt(float x)
sqrt = float (int sqrt)
[1..val1] |> List.filter isSquare |> List.length
// val val3: int = 2 (求1-5的平方数数量)
这是什么东西
这段代码F#在绑定(什么是绑定?以后再说)的时候,可以随心所欲的写任何东西在里面,val3的最终的值,就是这一个局部表达式返回的结果。也许,我们也可以理解这是一个类似函数的东西,最后一行就是函数的返回值
当然不是说这么写就一定好,但这一定程度上,体现了F#强大的自由度,以及其引发的可能性。
F#还有更多有意思的特性等着我们来探索,今天我们就到这里了,初步感受了一下 F# 的能力。以后我们将学习monad,模式匹配等概念给我们带来更多的思维上的冲击。
这些内容,我们就等以后慢慢学习吧。那么……
最后,欢迎来到F#的世界!
视频链接【F#练习】初见F#!
微信公众号搜索:scixing的炼丹房
标签:函数,C#,编程,add,let,result,val1,你好 From: https://blog.csdn.net/scixing/article/details/143220197