学习笔记-涛讲F#(中级)
这一系列的视频主要讲了F#设计模式的实现,没有太多其它内容,笔记内容主要是转载Snippets tagged design patterns的代码用于备份。设计模式相关的概念可参考设计模式:23种设计模式全面解析,本文不做太多介绍。
适配器模式
从不兼容的类型调用方法——原文链接
type Cat() =
member this.Walk() = printfn "cat walk"
type Dog() =
member this.Walk() = printfn "dog walk"
let adapter() =
let cat = Cat()
let dog = Dog()
let inline walk (x : ^T) = (^T : (member Walk : unit->unit) (x))
walk(cat)
walk(dog)
适配器模式的主要功能是由 inline 这行函数实现的,调用时直接使用 adapter() 即可。inline不可省略——因为内联函数可以具有静态解析的类型参数,而非内联函数不能。
责任链模式
以下示例要确保此人的年龄在 18 到 65 岁之间,体重不超过 200 并且足够高(>120)——原文链接
type Record = {
Name : string;
Age : int;
Weight: float;
Height: float;
}
let ChainOfResponsibility() =
let validAge (record:Record) =
record.Age < 65 && record.Age > 18
let validWeight (record:Record) =
record.Weight < 200.
let validHeight (record:Record) =
record.Height > 120.
let check (f:Record->bool) (record:Record, result:bool) =
if result=false then (record, false)
else (record, f(record))
let chainOfResponsibility = check(validAge) >> check(validWeight) >> check(validHeight)
let john = { Name = "John"; Age = 80; Weight = 180.; Height=180. }
let dan = { Name = "Dan"; Age = 20; Weight = 160.; Height=190. }
printfn "john result = %b" ((chainOfResponsibility (john, true)) |> snd)
printfn "dan result = %b" ((chainOfResponsibility (dan, true)) |> snd)
责任链模式的主要功能是由 check函数+函数正向组合运算符>> 实现的,check函数的输入一个处理者函数和一个处理结果,如果已有的处理结果为false则直接返回,否则调用处理者函数更新处理结果。
关于元组的两个操作:
- fst:返回元组的第一个元素
- snd:返回元组的第二个元素
命令模式
重做撤消场景的命令模式——原文链接
type Command = { Redo: unit->unit; Undo: unit->unit }
let result = ref 7
let add n = {
Redo = (fun _ -> result:= !result + n);
Undo = (fun _ -> result := !result - n) }
let minus n = {
Redo = (fun _ -> result:= !result - n);
Undo = (fun _ -> result := !result + n) }
let cmd = (add 3)
printfn "current state = %d" !result
cmd.Redo()
printfn "after redo: %d" !result
cmd.Undo()
printfn "after undo: %d" !result
注:ref 表示可变引用的类型,使用函数[!]和[:=]以获得和设置此类型的值。
另外一种 redo-undo 实现将命令分组在 Do/Undo 类别下,参考 Redo-Undo II 的命令模式。个人觉得对命令分组并不好,每次扩展命令的时候都要改分组部分的代码。
策略模式
根据环境或者条件的不同选择不同的算法或者策略来完成目标功能——原文链接
let quicksort l =
printfn "quick sort"
let shellsort l =
printfn "shell short"
let bubblesort l =
printfn "bubble sort"
type Strategy(sortFunction) =
member this.SortFunction with get() = sortFunction
member this.Execute(list) = sortFunction list
let strategy() =
let s = Strategy(quicksort)
s.Execute([1..6])
strategy()
工厂模式
简单工厂模式的实现——原文链接
type IA =
abstract Action : unit -> unit
type Type =
| TypeA
| TypeB
let factory = function
| TypeA -> { new IA with
member this.Action() = printfn "type A" }
| TypeB -> { new IA with
member this.Action() = printfn "type B" }
单例模式
饿汉式单例模式的实现——原文链接
type A private () =
static let instance = A()
static member Instance = instance
member this.Action() = printfn "action"
let DesignPatter1() =
let a = A.Instance;
a.Action()
其它内容
剩下的设计模式准备等到视频出来后再转载,后面的Type Provider太过专业很少用到,后面遇到实际应用场景时在学习。
学习笔记-涛讲F#(中级)的更多相关文章
- Python学习笔记第一讲
1.pycharm快捷键 撤销与反撤销:Ctrl + z,Ctrl + Shift + z 缩进.不缩进:Tab.Shift + tab 运行:Shift + F10 取消注释,行注释:Ctrl + ...
- mybatis学习笔记第一讲
第一步:先配置mybatis配置 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE confi ...
- 初探 Elasticsearch,学习笔记第一讲
1. ES 基础 1.1 ES定义 ES=elaticsearch简写, Elasticsearch是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储.检索数据:本身扩展 ...
- The Missing Semester - 第一讲 学习笔记
The Missing Semester - 第一讲 学习笔记 第一讲 课程概览与 shell 课程视频地址: https://www.bilibili.com/video/BV1Eo4y1d7KZ/ ...
- 学习笔记(二)--->《Java 8编程官方参考教程(第9版).pdf》:第七章到九章学习笔记
注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.若有违本之,则本人不负法律责任.违法者自负一切 ...
- 学习笔记(一)--->《Java 8编程官方参考教程(第9版).pdf》:第一章到六章学习笔记
注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.违者本人不负法律责任.违法者自负一切法律责任. ...
- HTML&CSS基础学习笔记1.16-单元格间距和表格主体
上一篇讲html学习笔记,讲过了合并单元格,那么今天就来介绍下如何控制单元格的间距,以及表格主体的相关知识. 单元格间距 在上个知识点的显示结果中你可能发现了,单元格与单元格之间有一小段空白.这是由& ...
- 学习笔记(三)--->《Java 8编程官方参考教程(第9版).pdf》:第十章到十二章学习笔记
回到顶部 注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.若有违本之,则本人不负法律责任.违法 ...
- activiti学习笔记一
activiti学习笔记 在讲activiti之前我们必须先了解一下什么是工作流,什么是工作流引擎. 在我们的日常工作中,我们会碰到很多流程化的东西,什么是流程化呢,其实通俗来讲就是有一系列固定的步骤 ...
- 【转载】【时序约束学习笔记1】Vivado入门与提高--第12讲 时序分析中的基本概念和术语
时序分析中的基本概念和术语 Basic concept and Terminology of Timing Analysis 原文标题及网址: [时序约束学习笔记1]Vivado入门与提高--第12讲 ...
随机推荐
- C/C++ 关于继承与多态笔记
继承的基本语法: 继承的目的就是用于提高代码的可用性,减少代码的重复内容,高效开发. #include <iostream> using namespace std; class Base ...
- WebAssembly核心编程[2]:类型系统
对于绝大多数编程语言来说,类型都是编程的基础,WebAssembly自然也不例外.总的来说,WebAssembly涉及的类型不多,很好掌握,接下来我们就来介绍一下WebAssembly编程涉及到的几种 ...
- InnoDB存储引擎的行级锁
InnoDB存储引擎的行级锁 InnoDB存储引擎和MyISAM的其中有两个很重要的区别:一个是事务,一个就是锁机制不同.事务之前有介绍,有问题的去补课;锁方面的不同是InnoDB引擎既有表锁又有行锁 ...
- ICLR 2024 | Mol-Instructions: 面向大模型的大规模生物分子指令数据集
Mol-Instructions: 面向大模型的大规模生物分子指令数据集 发表会议:ICLR 2024 论文标题:Mol-Instructions: A Large-Scale Biomolecula ...
- Navicat 15 for MySQL 破解【我亲测可用】
1.去官网下载正版 https://www.navicat.com.cn/ 2.破解下载:https://files-cdn.cnblogs.com/files/del88/NavicatKeygen ...
- JS leetcode 旋转数组 题解分析
壹 ❀ 引 今天来做一道同样简单,但是挺有趣的题,题目来自leetcode189. 旋转数组,题目描述如下: 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: ...
- NC50381 道路和航线
题目链接 题目 题目描述 FarmerJohn正在一个新的销售区域对他的牛奶销售方案进行调查.他想把牛奶送到T个城镇,编号为1到T.这些城镇之间通过R条道路(编号为1到R)和P条航线(编号为1到P)连 ...
- 【OpenGL ES】第一个案例
1 前言 OpenGL(Open Graphics Library)是由 SGI 公司开发的一套 3D 图形软件接口标准,由于具有体系结构简单合理.使用方便.与操作平台无关等优点,OpenGL 迅 ...
- 我们在SqlSugar开发框架中,用到的一些设计模式
我们在<SqlSugar开发框架>中,有时候都会根据一些需要引入一些设计模式,主要的目的是为了解决问题提供便利和代码重用等目的.而不是为用而用,我们的目的是解决问题,并在一定的场景下以水到 ...
- Spring Boot+Eureka+Spring Cloud微服务快速上手项目实战
说明 我看了一些教程要么写的太入门.要么就是写的太抽象.真正好的文章应该是快速使人受益的而不是浪费时间.本文通过一个包括组织.部门.员工等服务交互的案例让刚接触spring cloud微服务的朋友快速 ...