iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >F#语言实例分析
  • 409
分享到

F#语言实例分析

2023-06-17 06:06:45 409人浏览 薄情痞子
摘要

这篇文章主要讲解了“F#语言实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“F#语言实例分析”吧!在F#编写一个两个数相加的函数,在F# Interactive中输入:1let&nbs

这篇文章主要讲解了“F#语言实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“F#语言实例分析”吧!

在F#编写一个两个数相加的函数,在F# Interactive中输入:

1

let add num1 num2=num1*num2;;

F# Interactive为我们推断了这个函数类型:val add : num1:int -> num2:int -> int,表示add有两个int类型的参数得到了1个int类型。

函数当作参数:

1

2

3

4

5

6

//C#

private int Twice(int input,Func<int,int> f)

{

    return f(f(input));

}

var result = Twice(2, n => n*n);

使用F#则只需要非常简洁的一个函数声明:

1

2

3

4

5

6

> let twice (input:int) f=f(f(input));;

 

val twice : input:int -> f:(int -> int) -> int

 

> twice 2 (fun n->n*n);;

val it : int = 16

val twice : input:int -> f:(int -> int) &ndash;> int 这句话则是F# Interactive给出的推断:twice函数需要一个int参数和一个(int->int)的函数作为参数,返回一个int.

这两个例子仅仅是热身,并不是本篇博客的重点,所以你觉得前两个例子很无聊或者没太看明白请继续看下面的总结

场景:某种活动会有一个日程安排(Schedule),日程安排有3中类型,只举办一次(Once),每天一次(Daily),每周一次(Weekly)。活动会根据日程安排(Schedule)的类型不同具有不同的宣传内容,不同的延期举行策略。

你对于这样的场景会有怎么样的思考呢?

一、面向过程类型的编码方式

面向过程类型的编码是需求的直译过程,代码会写成这样:

显示活动的宣传内容:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

public void ShowScheduleDescriptions()

{

    switch (ScheduleType)

    {

        case ScheduleType.Once:

            Console.WriteLine("this is once activity");

            break;

        case ScheduleType.Daily:

            Console.WriteLine("this is daily activity");

            break;

        case ScheduleType.Weekly:

            Console.WriteLine("this is weekly activity");

            break;

        default:

            throw new InvalidOperationException("unsupported schedule");

    }

}

这样的代码初次看起来没什么问题,实际存在两个危险信号:

  • 违反开放封闭(OCP)原则,如果有一天需要加入一种Monthly类型,无疑需要修改这个方法;

  • 这样的代码风格会让接下来的开发者不假思索的进行延续,比方说需要根据不同的活动类型延期活动;

延期活动:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

public void DelaySchedule()

{

    switch (ScheduleType)

    {

        case ScheduleType.Once:

            Console.WriteLine("Delay one hour");

            break;

        case ScheduleType.Daily:

            Console.WriteLine("Delay one day");

            break;

        case ScheduleType.Weekly:

            Console.WriteLine("Delay one week");

            break;

        default:

            throw new InvalidOperationException("unsupported schedule");

    }

}

这样的代格违反了DRY原则,相同的代码框架却无法重用。

二、面向对象的编码方式

对于一个有经验的OO开发者,一旦看到switch,if(type=typeof(&hellip;))之类的代码马上会提高警惕,是不是有一些抽象类型没有被找出来?在这个例子中则会找出下面的抽象:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

public  class Schedule

{

    public virtual void ShowShowScheduleDescriptions()

    {

    }

 

    public virtual void DelaySchedule()

    {

    }

}

 

public class OnceSchedule : Schedule

{

    public override void ShowShowScheduleDescriptions()

    {

        Console.WriteLine("this is once activity");

    }

 

    public override void DelaySchedule()

    {

        Console.WriteLine("Delay one hour");

    }

}

 

public class DailySchedule : Schedule

{

    public override void ShowShowScheduleDescriptions()

    {

        Console.WriteLine("this is daily activity");

    }

 

    public override void DelaySchedule()

    {

        Console.WriteLine("Delay daily day");

    }

}

 

//... other schedule

这样的代码很好的解决了面向过程代码的两个问题,看起来更加具有扩展性,随着新类型的Schedule引入,旧的代码完全不用改动。

当然事情也不是绝对的,什么情况下需要改动旧代码呢?当需要扩展Schedule的行为的时候,例如需求升级,不同的Schedule具有不同的举办方式,我们不得不在每种Schedule中加入一个 void Hold()方法。

三、函数式解决方案

函数式语言则使用可区分联合和模式匹配来处理此类问题。

定义一个Schedule可区分联合:

1

2

3

4

type Schedule=

| Once of DateTime

| Daily of DateTime*int

| Weekly of DateTime*int

这个类型既说明了Schedule有三个不同的类型,同时定义了三种类型分别具有的数据结构。像是Enum和类的综合体,但是又显得特别精致。

显示活动的宣传内容,使用了模式匹配:

1

2

3

4

5

let ShowShowScheduleDescriptions schedule=

match schedule with

| Once(DateTime)-> printfn "this is once activity"

| Daily(DateTime,int)->printfn "this is daily activity"

| Weekly(DateTime,int)->printfn "this is weekly activity"

这个方法类似于switch&hellip;case,但是通过匹配可区分联合来实现,而不是通过一个显示的Enum来实现。

延期活动:

1

2

3

4

5

let DelaySchedule schedule=

match schedule with

| Once(DateTime)-> printfn "Delay one hour"

| Daily(DateTime,int)->printfn "Delay one day"

| Weekly(DateTime,int)->printfn "Delay one week"

函数式编程的解决方案认为可以很方便的添加新的行为,例如增加新的行为:Hold()。通过定义可区分联合和模式匹配来完成编码,整个解决方案像是面向过程和面向对象的一种结合体,但是侧重点不同,实现的代码也更加精致。

感谢各位的阅读,以上就是“F#语言实例分析”的内容了,经过本文的学习后,相信大家对F#语言实例分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: F#语言实例分析

本文链接: https://www.lsjlt.com/news/287340.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • F#语言实例分析
    这篇文章主要讲解了“F#语言实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“F#语言实例分析”吧!在F#编写一个两个数相加的函数,在F# Interactive中输入:1let&nbs...
    99+
    2023-06-17
  • Haskell语言实例分析
    这篇“Haskell语言实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Haskell语言实例分析”文章吧。例子:qu...
    99+
    2023-06-17
  • C语言分支语句实例分析
    这篇文章主要介绍了C语言分支语句实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言分支语句实例分析文章都会有所收获,下面我们一起来看看吧。C语言的语句C语句可分为以下五类: 表达式语句 函数调用语句 ...
    99+
    2023-06-30
  • C语言分支句实例分析
    今天小编给大家分享一下C语言分支句实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。何为语句C语言中由一个分号;隔开的就...
    99+
    2023-06-29
  • Go 语言结构实例分析
    当前的调试部分可以使用 go run filename.go 来执行。 可以生成一个 build.sh 脚本,用于在指定位置产生已编译好的 可执文件: #!/usr/bin/en...
    99+
    2024-04-02
  • f#简易Comet聊天服务实例分析
    f#简易Comet聊天服务实例分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Visual Studio 2010中关于F#的部分已经众人皆知,那么具体该怎么开发呢?这里...
    99+
    2023-06-17
  • C语言结构体实例分析
    这篇文章主要介绍“C语言结构体实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言结构体实例分析”文章能帮助大家解决问题。1. 动态内存管理C语言代码----->编译----->...
    99+
    2023-06-29
  • C语言字符串实例分析
    本篇内容主要讲解“C语言字符串实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言字符串实例分析”吧!看下面这个我们熟知的也是最先学习的代码"Hello world!"...
    99+
    2023-06-29
  • C语言单链表实例分析
    今天小编给大家分享一下C语言单链表实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、移除链表元素链接直达:移除链表元...
    99+
    2023-06-30
  • Go语言选择器实例分析
    今天小编给大家分享一下Go语言选择器实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。引言在 Go 语言中,表达式&nb...
    99+
    2023-07-02
  • C语言循环与分支语句实例分析
    本篇内容主要讲解“C语言循环与分支语句实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言循环与分支语句实例分析”吧!写在开始0表示假,非0表示真。1. 分支语句分支语句也叫做条件选择语...
    99+
    2023-06-30
  • R语言关于协方差分析实例分析
    我们使用回归分析创建模型,描述变量在预测变量对响应变量的影响。 有时,如果我们有一个类别变量,如Yes / No或Male / Female等。简单的回归分析为分类变量的每个值提供多...
    99+
    2024-04-02
  • C++语言举例分析
    这篇文章主要介绍“C++语言举例分析”,在日常操作中,相信很多人在C++语言举例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++语言举例分析”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!因为依赖开...
    99+
    2023-06-17
  • C语言的div()函数实例分析
    本文小编为大家详细介绍“C语言的div()函数实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言的div()函数实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。...
    99+
    2024-04-02
  • C语言指针使用实例分析
    今天小编给大家分享一下C语言指针使用实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。何为指针指针这玩意说白了,就是用来...
    99+
    2023-07-02
  • C语言全局变量实例分析
    本篇内容主要讲解“C语言全局变量实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言全局变量实例分析”吧!我们知道,全局变量是C语言语法和语义中一个很重要的知识点,首先它的存在意义需要从...
    99+
    2023-06-30
  • VBS入门脚本语言实例分析
    这篇文章主要介绍“VBS入门脚本语言实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“VBS入门脚本语言实例分析”文章能帮助大家解决问题。一、VBS简介VBS是一种Windows脚本语言,全称是...
    99+
    2023-06-30
  • C语言指针应用实例分析
    这篇文章主要讲解了“C语言指针应用实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言指针应用实例分析”吧!1、指针是什么指针理解的2个要点:平时口语中说的指针,通常指的是指针变量,...
    99+
    2023-06-30
  • C语言指针运算实例分析
    这篇文章主要介绍“C语言指针运算实例分析”,在日常操作中,相信很多人在C语言指针运算实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言指针运算实例分析”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-30
  • C语言函数使用实例分析
    这篇文章主要介绍了C语言函数使用实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言函数使用实例分析文章都会有所收获,下面我们一起来看看吧。函数的声明和定义函数声明告诉编译器有一个函数叫什么,参数是什么...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作