这一系列的视频主要讲了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#(中级)的更多相关文章

  1. Python学习笔记第一讲

    1.pycharm快捷键 撤销与反撤销:Ctrl + z,Ctrl + Shift + z 缩进.不缩进:Tab.Shift + tab 运行:Shift + F10 取消注释,行注释:Ctrl + ...

  2. mybatis学习笔记第一讲

    第一步:先配置mybatis配置 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE confi ...

  3. 初探 Elasticsearch,学习笔记第一讲

          1. ES 基础   1.1 ES定义   ES=elaticsearch简写, Elasticsearch是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储.检索数据:本身扩展 ...

  4. The Missing Semester - 第一讲 学习笔记

    The Missing Semester - 第一讲 学习笔记 第一讲 课程概览与 shell 课程视频地址: https://www.bilibili.com/video/BV1Eo4y1d7KZ/ ...

  5. 学习笔记(二)--->《Java 8编程官方参考教程(第9版).pdf》:第七章到九章学习笔记

    注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.若有违本之,则本人不负法律责任.违法者自负一切 ...

  6. 学习笔记(一)--->《Java 8编程官方参考教程(第9版).pdf》:第一章到六章学习笔记

    注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.违者本人不负法律责任.违法者自负一切法律责任. ...

  7. HTML&CSS基础学习笔记1.16-单元格间距和表格主体

    上一篇讲html学习笔记,讲过了合并单元格,那么今天就来介绍下如何控制单元格的间距,以及表格主体的相关知识. 单元格间距 在上个知识点的显示结果中你可能发现了,单元格与单元格之间有一小段空白.这是由& ...

  8. 学习笔记(三)--->《Java 8编程官方参考教程(第9版).pdf》:第十章到十二章学习笔记

    回到顶部 注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.若有违本之,则本人不负法律责任.违法 ...

  9. activiti学习笔记一

    activiti学习笔记 在讲activiti之前我们必须先了解一下什么是工作流,什么是工作流引擎. 在我们的日常工作中,我们会碰到很多流程化的东西,什么是流程化呢,其实通俗来讲就是有一系列固定的步骤 ...

  10. 【转载】【时序约束学习笔记1】Vivado入门与提高--第12讲 时序分析中的基本概念和术语

    时序分析中的基本概念和术语 Basic concept and Terminology of Timing Analysis 原文标题及网址: [时序约束学习笔记1]Vivado入门与提高--第12讲 ...

随机推荐

  1. 3.0 熟悉IDAPro静态反汇编器

    IDA Pro 是一种功能强大且灵活的反汇编工具,可以在许多领域中发挥作用,例如漏洞研究.逆向工程.安全审计和软件开发等,被许多安全专家和软件开发者用于逆向工程和分析二进制代码.它支持大量的二进制文件 ...

  2. 驱动开发:如何枚举所有SSDT表地址

    在前面的博文<驱动开发:Win10内核枚举SSDT表基址>中已经教大家如何寻找SSDT表基地址了,找到后我们可根据序号获取到指定SSDT函数的原始地址,而如果需要输出所有SSDT表信息,则 ...

  3. C++ Boost 函数与回调应用

    #include <iostream> #include <string> #include <boost\bind.hpp> using namespace st ...

  4. Spark源码修改环境搭建

    过程中存在问题: maven编译scala工程报错java.lang.NoClassDefFoundError: scala/reflect/internal/Trees,解决方案看maven编译 1 ...

  5. 【题解】P5461 赦免战俘

    一.题目 现有 \(2^n\times2^n\ (n≤10)\) 名作弊者站成一个正方形方阵等候 kkksc03 的发落.kkksc03 决定赦免一些作弊者.他将正方形矩阵均分为 4 个更小的正方形矩 ...

  6. 零基础入门Vue之画龙点睛——再探监测数据

    追忆 上一节:零基础入门Vue之影分身之术--列表渲染&渲染原理浅析 虽然我深知,大佬告诉我"先学应用层在了解底层,以应用层去理解底层",但Vue的数据如何检测的我不得不去 ...

  7. CF1903

    A 若 \(k>1\),冒泡排序:否则判断是否已经有序. B 初始令 \(a_i=2^{30}-1\),然后对于每个限制,让 \(a_i\leftarrow a_i\&M_{i,j},\ ...

  8. HWS山大专区PWN双一血 & CRYPTO-WP

    2023.11.18 两天半的比赛,就打了半天(因为要赶去打香山杯决赛了),不过结果还算好,人生第一次拿了两个一血hhh.写wp的时候人在中大南校北门的酒店里:) controller 格式化字符串泄 ...

  9. NC23047 华华给月月出题

    题目链接 题目 题目描述 华华刚刚帮月月完成了作业.为了展示自己的学习水平之高超,华华还给月月出了一道类似的题: \(Ans=\oplus_{i=1}^N(i^N\mod(10^9+7))\) \(\ ...

  10. ElementUI导入Excel文件

    功能介绍 最近用ElementUI做管理系统需要把excel数据导入到系统内,我想这是一个很常见的功能点,把它分享出来,希望对大家有所帮助:) 实现效果 实现步骤 1.定义导入组件 <el-up ...