F#学习之路(5) 元组类型

元组类型,表示一组有序数据类型的集合。F#通过支持元组类型,方便了我们定义临时数据结构,而不需要为了临时的数据专门定义一个数据类型。

一、元组的定义:

let tuple_2=(1,2)
let tuple_3=("F#",1.9,"F# Function Language")

在F#中元组使用小括号,元素之间逗号分隔来定义。元组元素可以是任何类型。

上面代码中,tuple_2的类型是int*int,而tuple_3的类型为string*float*string。元组类型使用元组元素类型乘号连接的方式。

元组类型可以作为函数的输入参数,也可以作为函数的返回值。

let test (a,b,c) =
a+1,b+2,c+3

上面函数的类型为 int*int*int->int*int*int

元组类型虽然方便我们组织一组数据类型,而无需专门定义一个数据结构。但很显然他不能很好地帮助我们理解数据结构的语义,尤其是互操作时作为函数返回值的情况下。给元组类型取一个别名,能够部分缓解这个问题。

type FSharpDesc=string*float*string
let getFSharpDesc ():FSharpDesc =
("F#",1.9,"F# Function Language")

二、元组类型的比较

在F#中元组类型可以进行比较,前提当然是同类型的元组类型。所谓同类型,是指元组的元素长度相等,元素类型相同。F#从前至后依次比较。

do printfn "%b" ((1,2,3,4,5,6,7,8,9) <(2,1,2,3,4,5,6,7,8))

打印的结果 为 true

三、元组与模式匹配

模式匹配在函数式语言中经常出现,其功能强大。比命令式语言中switch强大的多。不仅可以匹配基本类型、元组类型、列表类型、记录类型,还可以用于类型检测。在F#中还允许自定义类型的模式匹配,通过活动模式(Active Pattern)可以做到这一点。

let tuple_7=(1,2,3,4,5,6,(7,8,9))
let one,two,three,four,five,six,seven=tuple_7
[one;two;three;four;five;six;] @ (match seven with t1,t2,t3 ->[t1;t2;t3] )
|> List.iteri
(fun index item ->printfn "%d,%A" index item)

元组类型不仅可以使用常用的模式匹配方法。

match seven with t1,t2,t3 ->[t1;t2;t3]

还可以使用隐式的模式匹配方法来分解元组

let one,two,three,four,five,six,seven=tuple_7

这种隐式的模式匹配大大方便了我们使用元组类型的分解。上面的代码使用了列表,列表将在下一篇博客中讨论。

时间: 2024-10-28 15:31:24

F#学习之路(5) 元组类型的相关文章

F#学习之路(6) 列表类型

列表在函数式编程中占据着重要的位置.在Lisp语言中,一切皆是列表,就连函数也是列表,列表在Lisp语言中发挥到了极致.F#语言列表语法来源于Ocaml,与Haskell语言也基本一致.本文只会讲解一些常用的使用方法,要很好的掌握列表,各位朋友可以google一下相关的内容.网络上对列表讨论比较深刻的大多以Haskell语言为例(Lisp语言列表很强大,但与大多数函数式语言列表的区别太大,不好借鉴). 一.如何定义列表 在F#中定义一个列表,有几个方法. 1.使用字量值 let l=[1;2;3

F#学习之路(4) 基本类型

F#基本类型包括整型.浮点型.布尔型(bool).字符型(char).字符串型(string),还有元组类型(tuple).列表类型(list).数组类型(array),序列类型(seq).另外,还允许我们定义记录类型(record type).联合类型(union type).活动模式等.当然,F#作为一种多范式的编程语言,支持所有的OO编程语法,允许我们定义类.接口.委托.结构等,本篇文章只介绍基本类型,其它类型在后续的文章中一一介绍. 上面这张图,比较的详细的介绍了F#的基本类型.左边一列

F#学习之路(7) 集合类型

上一篇博客,介绍了列表类型,本篇将介绍数组类型Array.字典类型(Map),以及可变数组(ResizeArray).Set类型. 一.数组类型 (Array) 数组类型,在语义上表示一组相同类型的集合.这个跟列表(List)相似,两者的区别在于列表类型数据元素不可变,而数组类型可以.虽然数组类型随机访问,在查询访问上性能优先列表,但列表在变更集合(增加.删除集合元素)上有更好的性能.这个跟大多数语言是相似的. 定义数组类型的语法,跟列表也很相似,区别在于数组多了两个"|"符合. le

F#学习之路(2) 深刻理解函数(上)

函数在函数式编程语言中是一等公民,是函数式语言中最重要的基本组成元素,也是其名称的由来. F# 中的函数之如C#中的类,是组织程序结构的最基本单元.是命令式编程语言中函数或OO编程语言中方法的超集.超集,有多强大?我将在下面几个方面细细道来. F#是一种多范式的编程语言.支持命令式.函数式.面向对象的编程范式,还有目前火热的面向语言编程(DSL).本文不会介绍其他的编程范式,只介绍函数式编程范式. 在面向对象编程的世界里,视命令式或过程式是一种丑陋的编程方式,至少被大多数程序员视为不能有效发挥O

F#学习之路(2) 深刻理解函数(下)

3.函数作用域 在F#中组织程序结构的方法有以下几种,使用类型 (type)来支持自定义数据类型,使用名称空间(namespace)来确保类型唯一,模块(module)则用来封装某一数据类型及其操作,而函数则封装了行为或业务逻辑.本文只简单介绍模块(module),其他内容将在下一主题中讨论. 函数是函数式语言中最基本的组成,是应用程序中具体业务逻辑的实现者,弄清其作用域非常必要. 在F#语言中,每一个源代码文件(本文仅指以.fs为扩展名的文件),其默认有一个以文件名首字母大写的模块名(modu

F#学习之路(1)什么是函数式编程

对于什么是函数式编程,这个是人云亦云.本文并不打算对此进行定义,而是希望与园子里的朋友们共同探讨这个话题,抛砖只为引玉. 1.维基百科给出的定义是: 函数式编程是种编程范式,它将电脑运算视为函数的计算.函数编程语言最重要的基础是λ 演算(lambda calculus). 而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值). 2.函数应该是高阶函数,可柯里化 从维基百科定义可以看出,大家对函数式编程语言中,函数是一等公民(first class)这个概念是没有异议的. 函数应该享受值的

Qt学习之路(23):自定义事件

Qt允许你创建自己的事件类型,这在多线程的程序中尤其有用,当然,也可以用在单线程的程序中,作为一种对象间通讯的机制.那么,为什么我需要使用事件,而不是使用信号槽呢?主要原因是,事件的分发既可以是同步的,又可以是异步的,而函数的调用或者说是槽的回调总是同步的.事件的另外一个好处是,它可以使用过滤器. Qt中的自定义事件很简单,同其他类似的库的使用很相似,都是要继承一个类进行扩展.在Qt中,你需要继承的类是QEvent.注意,在Qt3中,你需要继承的类是QCustomEvent,不过这个类在Qt4中

Qt 学习之路 2 --- 读书笔记

一.文章来由 来自豆子老师非常好的一本Qt教程,但是只有网络版,所以用这个做笔记了,不动笔墨不读书嘛~~ 二.读书笔记 1.Qt 学习之路 2(2):Qt 简介 1.1 关于 Qt 的一站式解决 Qt 是一个著名的 C++ 应用程序框架.但并不只是一个 GUI 库,因为 Qt 十分庞大,并不仅仅是 GUI 组件.使用 Qt,在一定程度上你获得的是一个"一站式"的解决方案:不再需要研究 STL,不再需要 C++ 的,不再需要到处去找解析 XML.连接数据库.访问网络的各种第三方库,因为

Webwork 学习之路(六)Action 调用

阅读目录 1.这部分框架类关系 2.Webwork 获取和包装 web 参数 3.DefaultActionProxyFactory.DefaultActionProxy.DefaultActionInvocation       一路走来,终于要开始 webwork 核心业务类的总结,webwork 通过对客户端传递的 web 参数重新包装,进行执行业务 Action 类,并反馈执行结果,本篇源码分析对应下图 WebWork 框架流转图中红色框的地方. 回到顶部 1.这部分框架类关系 回到顶部