首页 > 编程语言 >你好,F#! 你好,函数式编程!

你好,F#! 你好,函数式编程!

时间:2024-10-24 21:45:27浏览次数:3  
标签:函数 C# 编程 add let result val1 你好

如果你之前只接触过类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

相关文章

  • 在Kotlin中如何利用协程进行异步编程
    使用Kotlin语言的协程,可进行高效的异步编程。关键步骤包含:1、引入相关库、2、创建协程作用域、3、使用构建器启动协程、4、管理协程生命周期以及并发,5、与其他线程互操作与异常处理。特别地,第2点,创建协程作用域涉及到定义一个`CoroutineScope`,这一环节是构建和管理Kotlin中协程生......
  • Python小白学习教程从入门到入坑------第十四课 函数基础(语法基础)
    一、函数def定义:将具有独立功能的代码块组织成一个整体,使其具有特殊功能的代码集作用:使用函数可以加强代码的复用性,提高编程续写的效率结构:def 函数名():     函数体注意:函数名要符合标识符规定,最好见名知意,调用函数前,必须保证函数已经存在eg:#1.定义函数#......
  • C++学习笔记2——函数重载
    1.函数重载1.1默认参数C++新增的默认参数指的是函数调用省略实参时自动调用的一个值。通过函数原型设置函数的默认参数,函数定义与没有默认参数时完全相同。如以下函数原型:char*left(constchar*str,intn=1);调用时如果省略参数n,则它的值将为1;否则传入的值将......
  • 实验2 类和对象_基础编程1
    实验任务1:实验代码:1#include<string>23//类T:声明4classT{5//对象属性、方法6public:7T(intx=0,inty=0);//普通构造函数8T(constT&t);//复制构造函数9T(T&&t);//移动构造函数10~T();......
  • Day10 函数基础+函数三种定义形式 + 函数的返回值、对象和参数 + 可变长参数
    目录0上节课复习0.1文件是什么0.2操作文件的步骤0.3open0.4指针操作0.5文件的复制1函数基础1.1函数的作用1.2函数的定义形式1.3函数定义的两个阶段2定义函数的三种形式2.1无参函数2.2有参函数2.3空函数3函数的返回值4函数对象5函数参数的应用5.1函数定义分为两个......
  • 认识jQuery函数和对象
    ◼jQuery是一个工厂函数(别名$),调用该函数,会根据传入参数类型来返回匹配到元素的集合,一般把该集合称为jQuery对象。如果传入假值:返回一个空的集合。如果传入选择器:返回在在documnet中所匹配到元素的集合。如果传入元素:返回包含该元素的集合。如果传入HTML字符......
  • 实验3 C语言函数应用编程
    实验一#include<stdio.h>charscore_to_grade(intscore);intmain(){intscore;chargrade;while(scanf("%d",&score)!=EOF){grade=score_to_grade(score);printf("分数:%d,等级:%c\n\n",score,grade);......
  • 分段函数+函数性质的新定义问题
    专题:分段函数+函数性质\(\qquad\qquad\)题型:新定义问题\(\qquad\qquad\)难度系数:★★★ 【题目】所谓图形\(D\)完全覆盖曲线\(G\)是指\(G\)中的每一个点都落在\(D\)的内部或边界,现用一个有两个顶点在\(x\)轴上的矩形区域完全覆盖函数\(f(x)=\left\{\begin{ar......
  • MySQL数据库中(存储过程和函数)的使用
    存储过程(StoredProcedure)是事先经过编译并存储在数据库中的一段SQL语句的集合。存储过程实际上就是数据库SQL语言层面的代码封装与重用。存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。存......
  • 实验2 类和对象_基础编程1
    实验任务1:t.h源码:1#pragmaonce23#include<string>45//类T:声明6classT{7//对象属性、方法8public:9T(intx=0,inty=0);//普通构造函数10T(constT&t);//复制构造函数11T(T&&t);//移动构造函数12......