![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
F#
文章平均质量分 91
大福是小强
我很懒,不小心就成了程序员。E-mail:qchen2015@hotmail.com。
展开
-
F#奇妙游(35):MVC模式和ADT分析
F#中的事件驱动编程,可以通过来实现;通过ADT,可以很好地抽象出MVC模式;通过MVC模式,可以很好地描述事件驱动的程序。原创 2023-09-28 11:02:10 · 150 阅读 · 0 评论 -
F#奇妙游(34):另外一种动态执行F#代码的方法
FSharp.Compiler.Service提供了丰富的建立进程的工具;可以通过FsiEvaluationSession来完成值的交互和表达式求值;这个方法感觉上调用起来比编译成Assembly要轻量一些;两个方法的比较可以在应用中再考虑。原创 2023-09-16 11:23:04 · 184 阅读 · 0 评论 -
F#奇妙游(33):动态执行F#代码
最近正在用F#开发一个应用系统,其中核心的问题是建立一个系统,这个系统有串联和并联的分系统嵌套组成,所以构成的样子就好比说是:fill:#333;color:#333;color:#333;fill:none;AB1B2B3C如果把这个系统描述可能需要序列化,也就是存在硬盘上。fill:#333;color:#333;color:#333;fill:none;人类硬盘文件内存对象可阅读的图形表达这个系统的编程下面再单独写一篇,这里只考虑序列化的问题。原创 2023-09-13 13:14:45 · 109 阅读 · 0 评论 -
F#奇妙游(32):缺失数据集合的处理
假设我们有一个类似于CSV的文件,每行的数据用’,'隔开。文件中有些数据是缺失的,也有些数据没有保存,采用字符串说明。我们省略文件读取的过程,仅仅把第一行数据拿来作为例子。这个数据的解析也挺麻烦的,因为碰到有引号的字符串,我们要把他当做一个单独的单元,考虑到引号内可能会有’,'。我们单独实现一个String的方法,来完成这个功能。这个函数里有两个相互调用的递归函数,定义的语法如下。这样定义才能保证在func1中递归调用func2。识别字符串中的数字可以使用。原创 2023-09-11 17:34:54 · 164 阅读 · 0 评论 -
F#奇妙游(31):数据缺失的处理
在处理数据时,缺失数据和无效数据是一个常见的问题。在F#中,我们可以使用FSharpOption来表示缺失数据。FSharpOption是一个泛型类型,它有两个值:Some和None。Some表示一个值,而None表示一个缺失的值。从ADT的组合数来分析,这个和类型的组合数是1CT。在通常的情况下,我们在F#中都把这个写作option,或者T option。而构造一个option的值,我们可以使用Some和None一般的,我们可以使用match表达式来处理option原创 2023-09-09 17:11:33 · 305 阅读 · 0 评论 -
F#奇妙游(30):计算表达式与ADT
F#中自定义的 Computation Expression 一共有8个语法构造,其中match!是let!的语法糖。在前面的一个帖子里我们已经介绍了 computation expression 中的绑定和返回,语法是let!和return。通过使用这两个语法,我们可以实现程序逻辑,而把程序逻辑和具体的实现分离开来。翻过去再看一遍,发现还是有点不太容易理解。于是嘛,书读百遍其义自见,我们就把这个例子再来一遍。原创 2023-09-08 16:04:06 · 119 阅读 · 0 评论 -
F#奇妙游(29):PPTX注释变音频插入页面
NET平台人才济济,个个说话都很好听;我们先来把这篇文章的内容做个PPT,然后转成视频吧……原创 2023-09-06 12:06:34 · 347 阅读 · 0 评论 -
F#奇妙游(28):ADT中简单值的F#实现
在领域建模中,我们尝尝会遇到一些简单的值,比如人的名字、人的编号、物品的代码。如果过早进行程序设计,这些值很容易就会变成程序设计语言中的基本量,stringint这些,就比如人的标号和物品的编号,很容易就被记录为int。然而根据DDD的原则,我们应该尽可能用领域专家认可的方式来记录设计。和这种只有一个选项的和类型(OR类型),也可以省略写成的形式。在dotnet fsi中运行,还是会识别为。这里面,第一个ObjectID是类型名称,第二个ObjectID是选项标签。原创 2023-09-05 15:37:29 · 171 阅读 · 0 评论 -
F#奇妙游(27):大大的小小let
let,三个字符,一开始就要用,学到computation expression,居然还会发现let别有洞天,值得一探,真是奇妙!最初刚开始学习F#时,对let的理解是,定义一个变量,或者定义一个函数。但从语法的角度看,结合当时的学习内容,这个理解也是没有问题的。在帮助文档中,"let所声明的实体的作用域限制在包含当前代码的域,仅限于申明之后的部分。"这样来看,可以理解为let在当前作用域例引入一个名称。F#是严格按照顺序的语言,所以let的作用域就是从let开始,到当前作用域结束。原创 2023-09-05 09:00:07 · 87 阅读 · 0 评论 -
F#奇妙游(26):计算表达式浅尝
计算表达式是一个有点难理解的东西。我把帮助全部看了一遍,记住了个上下文敏感的计算(contex-sensitive computation)。但是让我讲计算表达式是什么?为什么?怎么做?我是满头雾水。我大概知道是什么,就是一个语法特征,在一个表达式上下文中,使用诸如let!return这些语法,实现与上下文紧密相关的特殊计算。我甚至还能侃侃而谈上下文相关、如何构造某个特殊表达式,match!是let!的语法糖之类的。到底为什么?我不能回答。原创 2023-09-04 13:29:52 · 59 阅读 · 0 评论 -
F#奇妙游(25):ADT和领域设计
采用ADT来对领域进行设计,是一种很好的实践。在这种实践中,我们可以把领域中的数据抽象成ADT,把领域中的操作抽象成函数,然后利用ADT的类型系统来进行类型检查,从而保证领域中的数据和操作的正确性。原创 2023-09-02 10:23:26 · 185 阅读 · 0 评论 -
F#奇妙游(24):函数式编程与代数数据类型ADT
这篇主要是写函数式编程中的元素与ADT的关系,特别的就是关于表达式的讨论。在函数式编程中,表达式也是一个比较重要概念。下图是Scott Wlaschin关于F#核心概念的图。fill:#333;color:#333;color:#333;fill:none;函数式编程F#表达式与值类型系统模式匹配区别于面向过程的程序主要由语句(Statement)构成,函数式程序的主体是表达式(Expression)。原创 2023-08-28 08:57:07 · 123 阅读 · 0 评论 -
F#奇妙游(23):领域驱动设计DDD与代数数据类型ADT
ADT与DDD是一对好朋友;ADT是函数式编程中值类型的核心;函数式编程的核心是函数和ADT;ADT的组合数分析是ADT的一个重要特征;函数的参数和返回值都是ADT,函数本身也是一个ADT。原创 2023-08-24 10:00:18 · 106 阅读 · 0 评论 -
F#奇妙游(22):Monte Carlo方法的F#实现
I∫∫∫⋯∫fxdxI∫∫∫⋯∫fxdx形如上面的积分,当积分重数很大时,通过分步积分的方法很难求解。这时候可以使用Monte Carlo方法来求解。求解过程也很简单,就是随机生成一些点,然后计算这些点的函数值的平均值,乘以积分区域的体积。x∈∏i1naibix∈i1∏naibi其中,aibia_i, b_iaibi伪定义域的上下界。原创 2023-08-23 17:25:51 · 103 阅读 · 1 评论 -
F#奇妙游(21):为什么老是你,模式匹配!
模式匹配是一种编程语言的特性,它可以让我们根据不同的模式来执行不同的代码。模式匹配的本质是一种条件分支,但是它的语法更加简洁,更加清晰。在中,把模式匹配(控制结构)作为F#函数式编程的四个关键概念之一。F#的官方文档中对模式匹配描述为:模式是转换输入数据的规则。可在 F# 中使用模式将数据与一个或多个逻辑结构进行比较,将数据分解为各个构成部分,或通过各种方式从数据中提取信息。原创 2023-08-23 09:17:04 · 72 阅读 · 0 评论 -
F#奇妙游(20):主动模式
从语义上来看,模式匹配实现的是两个部分的功能:匹配检查,值绑定。匹配检查就是检查值是否符合模式,值绑定就是把值绑定到模式中的变量上。模式匹配的本质就是这两个功能的组合。主动模式是F#中非常有意思的一个特性。它的语法和语义都非常清晰,而且非常有用。在实际的应用中,可以大大的提高代码的可读性和可维护性。原创 2023-08-18 21:44:32 · 122 阅读 · 0 评论 -
F#奇妙游(19):F#中的模式匹配(match with)
F#中的match语句是一个强大的工具,它可以用来匹配各种各样的模式。模式匹配在现代语言中几乎是一个必备的特性,它可以保证程序的正确性,也可以让程序更加简洁。F#中还有一类更加复杂的模式,叫做活动模式(Active Patterns),这个在后面的文章中再介绍。原创 2023-07-23 16:33:10 · 171 阅读 · 1 评论 -
F#奇妙游(18):F#与百万浮点数MergeSort
Mergesort是一个典型的分而治之、迭代的算法。它将一个数组分成两个子数组,分别排序,然后将有序的子数组归并为一个有序的数组。归并操作是将两个有序数组归并成一个有序数组的过程。Mergesort的时间复杂度为O(nlogn),最佳和最坏情况下的时间复杂度都是O(nlogn)。它的空间复杂度为O(n)。采用函数式的方式可以以非常直观和很少的代码量实现Mergesort算法。但是这个算法很难(到底是不是不可能我还不能确定)实现尾递归优化,所以对于大的数据集,会导致栈溢出。原创 2023-07-22 16:54:41 · 61 阅读 · 0 评论 -
F#奇妙游(17):F#与真空一维平面大地抛石飞行力学
完美解决了真空一维平面大地的定高释放石头飞行力学问题;学习了F#的运算符重载机制;学习了F#复杂的类型测试match语法,注意括号的使用;F#进行数值计算果然还算是好用。原创 2023-07-21 15:13:55 · 211 阅读 · 0 评论 -
F#奇妙游(16):基于对象和面向对象
面向对象编程有两个层次,基于对象编程和面向对象编程;F#完美支持.NET体系中的基于对象编程技术。原创 2023-07-21 08:45:37 · 53 阅读 · 0 评论 -
F#奇妙游(15):优雅的WPF程序
F#可以用来做很多事情,但是UI总是一个让初学者激动的主题,实际上目前F#也有几个能用的UI库,比如Elmish.WPF,但是这里为了更好地学习F#和WPF,用编码的方式则更加有价值。F#提供的语言工具,类扩展、match、管道操作符、元组、属性等等,都可以用来实现一些非常优雅的代码,这些代码可以让我们的程序更加简洁、易读、易维护。我自己也是现学现卖,感觉还挺开心的!原创 2023-07-17 11:35:11 · 242 阅读 · 0 评论 -
F#奇妙游(14):F#实现WPF的绑定
F#的WPF开发还是比较麻烦的,特别是跟XAML比,略显繁琐。因为F#支持面向对象,所以还是能够比较容易就实现数据绑定。原创 2023-07-16 11:39:36 · 1199 阅读 · 0 评论 -
F#奇妙游(13):代码风格
这篇是最没有任何价值的,我都不知道为啥要写。原创 2023-07-15 18:04:21 · 158 阅读 · 0 评论 -
F#奇妙游(12):并行编程与π
F#中调用WPF同样容易,可能比WinForm还简单,不用XAML其实就是字多一点,也没啥;F#中的多线程功能非常丰富,自己async是很好的工程工具,.NET平台的各个工具也能使用;要界面有响应,就不要在UI线程外面掉UI代码,应该用。原创 2023-07-14 17:25:50 · 508 阅读 · 0 评论 -
F#奇妙游(11):函数+值=程序
函数式编程的核心是抽象动作,把一个值映射为另一个值的动作。函数式编程中处理的值包括数值、集合、函数,这是一个核心的概念。值+函数=程序。原创 2023-07-11 18:37:57 · 140 阅读 · 0 评论 -
F#奇妙游(10):可区分联合
Discriminated Union可以用来实现一些比较简单的继承关系;Discriminated Union的每个构造函数可以带多个参数,这些参数就是Discriminated Union的属性;比较复杂的继承关系,还是用类来实现比较好;与.NET体系中的其它语言交互的时候,Discriminated Union的使用会比较麻烦。原创 2023-07-08 10:46:20 · 207 阅读 · 0 评论 -
F#奇妙游(9):来一点点画图
Net画图的包不缺;目前感觉画的图专业性略有差距;F#调用、Jupyter都很丝滑。原创 2023-07-07 14:02:44 · 315 阅读 · 0 评论 -
F#奇妙游(8):计量单位
F#的Unit of Measure是一个很有意思的功能,但是实际上没有什么用。UnitsNet实现的单位系统是真正有用的。F#调用C#的库还是很好很强大的。原创 2023-07-04 14:39:18 · 694 阅读 · 0 评论 -
F#奇妙游(7):也来整点测评
这就是.NET的魅力,你可以选择性能,也可以选择开发效率(并不是)F#背靠着大的平台,还是可能有点实际用途的,这也是Clojure、Scala等语言比古早的Lisp、Haskell等语言更有可能被工业界采用的原因这就是.NET的魅力,你可以选择性能,也可以选择开发效率(并不是)F#背靠着大的平台,还是可能有点实际用途的,这也是Clojure、Scala等语言比古早的Lisp、Haskell等语言更有可能被工业界采用的原因.NET 8.0的AOT肿么回事,果然是preview版本。原创 2023-07-04 12:29:21 · 94 阅读 · 0 评论 -
F#奇妙游(6):如何不用for循环以及循环
F#中的集合类型有列表、数组、序列、集合、映射F#中的集合类型首先是值,应该首选函数式的方式来操作集合F#中的集合类型的方法都是静态函数,可以用管道操作符|>来操作F#中的循环可以用递归来实现,这个我也没想明白。原创 2023-07-04 07:50:11 · 679 阅读 · 0 评论 -
F#奇妙游(5):计算π的值
F#可以作为一个交互式计算器,可以解决所有小学生的奇怪计算。利用F#很直观地实现数学表达式,所采用的代码不采用循环、不使用变量,而是采用递归,这是函数式编程的典型思考方式。原创 2023-07-03 23:57:06 · 710 阅读 · 0 评论 -
F#奇妙游(4):F#的函数
F#中的函数是一个值,也就是说,函数也是一个值。函数的类型是输入量的类型到输出量的类型的映射。函数的组合、偏应用、柯里化和反柯里化是F#中的常见操作。这些都是函数式编程中的最基础概念,跟数学中的函数概念关系十分密切,也是函数式编程中的基础。最好是能够反复体会,不然后面看到代码时就会有各种各样的困惑。但是只要理解值不可变的核心观念,一切都可以理解。原创 2023-07-02 21:28:50 · 145 阅读 · 0 评论 -
F#奇妙游(3):函数与编程
函数是一个很好的抽象工具;程序设计中,掌握函数的概念非常有力;不同的编程范式,都可以用函数的概念来予以描述;表达定义域的内存(输入)与表达值域的内存(输出)重叠,就称为纯函数式语言和其他范式语言的差别。原创 2023-06-30 15:44:56 · 166 阅读 · 0 评论 -
F#奇妙游(2):dotnet命令行工具
NET命令行接口(CLI)是一个跨平台的工具链,用于支持.NET应用的开发、构建、运行和发布。安装.NET SDK可以用winget,也可以用PowerShell脚本和bash脚本。dotnet CLI提供的功能有完备的帮助,dotnet -h或者可以查看。dotnet CLI提供的功能有完备的帮助,dotnet -h或者可以查看。dotnet CLI各个功能的帮助通过或者可以查看。原创 2023-06-30 10:13:23 · 165 阅读 · 0 评论 -
F#奇妙游(1):F#浅尝
F#是一门非常有趣的语言,可以用来做很多事情。F#的语法非常简洁别扭,但是有时候也会让人摸不着头脑。F#的类型系统非常强大,但是有时候也会让人摸不着头脑。F#的类型推断非常强大,但是有时候也会让人摸不着头脑。我的头早就被摸秃了,所以我喜欢F#。原创 2023-06-29 09:56:37 · 137 阅读 · 0 评论