话说模式匹配(7) 一个构造器模式的例子(by case class)

第一篇讲述构造器模式匹配的时候给出过tree的例子,因为tree的数据结构很适合用构造器模式来解构。这次再看另一个例子。

scala里的List是个典型的很适用模式匹配的结构,它的接口和数据定义非常凝练。现在我们假设需要一个与List结构正好相反的结构MyList。

List由2部分组成,[head, tail],其中的head是元素本身,而tail则是List类型,也就是一种递归结构。
MyList也由2部分组成 [init, last],其中last是元素本身,而init则是MyList类型。(与List正好颠倒)

// 定义抽象类
abstract class MyList[+A]

// 具体子类,数据由两部分组成:init,last
case class Cons[B] (init:MyList[B], last:B) extends MyList[B]

// 元素为空的MyList单例对象,类似 Nil
case object Empty extends MyList[Nothing]

构造一下看看:

scala> val a = Cons(Empty,1)
a: Cons[Int] = Cons(Empty,1)

scala> a.last
res0: Int = 1

// 嵌套
scala> val b = Cons(Cons(Empty,1),2)
b: Cons[Int] = Cons(Cons(Empty,1),2)

// 模式匹配(Cons可以用中缀表达)
scala> b match{ case x Cons 1 Cons 2 => print(x) }
Empty

为了方便构造,还可以给MyList添加一个工厂方法:

object MyList {
    def apply[A](xs:A*):MyList[A] = {
        var r:MyList[A] = null
        var t:MyList[A] = Empty
        for(x<-xs) { r = Cons(t,x); t=r}
        r
    }
}

eg:

scala> MyList(1,2,3) match{ case x Cons 2 Cons 3 => print(x)}
Cons(Empty,1)

scala> MyList(1,2,3,4) match{ case x Cons 4 => print(x) }
Cons(Cons(Cons(Empty,1),2),3)
时间: 2024-08-31 16:08:34

话说模式匹配(7) 一个构造器模式的例子(by case class)的相关文章

话说模式匹配(8) 一个抽取器的例子

一个抽取器的例子 目前List的序列模式(sequence pattern)可以支持对前边若干元素的匹配,比如:List(1,2,3,_*),如果想要实现 List(_*, lastEle) 这样的形式,就需要通过自定义一个抽取器来实现了 // 自定义Extractor object Append { // 接受List结构 def unapply[A] (l: List[A]) = { // 返回Tuple2:前边的若干元素和最后一个元素 Some( (l.init, l.last) ) }

话说模式匹配(1) 什么是模式?

一些刚从java转到scala的同学在开发的过程中犹如深陷沼泽,因为很多的概念或风格不确定,scala里有很多的坑,模式匹配也算一个.我整理了一下自己所理解的概念,以及一些例子.这个系列最好有些scala的基本经验,或者接触过一些其他函数式语言. 要理解模式匹配(pattern-matching),先把这两个单词拆开,先理解什么是模式(pattern),这里所的模式并不是设计模式里的模式. 而是数据结构上的,这个模式用于描述一个结构的组成. 我们很容易联想到"正则表达"里的模式,不错,

话说模式匹配(4) scala里的赋值语句都是模式匹配吗?

先抛个问题,下面的语句是否都合理(编译通过),哪些会引起模式匹配? scala> val a = 100 scala> val A = 100 scala> val a@b = 100 scala> val (a,b) = (100,200) scala> val (a,B) = (100,200) //第二个变量大写 scala> val Array(a,b) = Array(100,200) scala> val Array(a,B) = Array(100,

话说模式匹配(3) 模式匹配的核心功能是解构

http://www.artima.com/scalazine/articles/pattern_matching.html 这篇文章是odersky谈scala中的模式匹配的一段对话,我做了部分片段翻译(不是连贯的): 模式可以嵌套,就像表达式嵌套,你可以定义深层的模式,通常一个模式看起来就像一个表达式.它基本上就是同一类事情. 它看起来像一个复杂的对象树构造表达式,只是漏掉了new关键字.事实上在scala当你构造一个对象,你不需要new关键字 然后你可以在一些地方用变量做站位符替代对象树上

JavaScript设计模式之工厂模式和构造器模式_javascript技巧

什么是模式 前阵子准备期末考试,劳神又伤身的,实在闲不得空来更新文章,今天和大家说说javascript中的设计模式. 首先呢,我们需要知道的是:模式是一种可复用的解决方案,而反模式呢就是针对某个问题的不良解决方案. js反模式常见例子 1.向setTimeout和setInterval传递字符串,而不是函数,这会触发eval()的内部使用. 2.在全局上下文中定义大量的变量污染全局命名空间 3.修改Object类的原型 4.以内联形式使用js,嵌入在HTML文件中的js代码是无法包含在外部单元

以一个最简单的例子把OO的JavaScript说明白

javascript  OO的JavaScript并不高深,麻烦就麻烦在google出来的国人介绍文章经常罗罗嗦嗦,而且之间的说法还各有不同,摆在一起就让人看了头大.这里重拾简单主义,以一个最简单的例子把OO Javascript说明白. 1.一个颇为精简的例子 //定义Circle类function Circle(radius) {    this.r = radius;}Circle.PI = 3.14159;Circle.prototype.area = function(  ) {ret

一个可逆加密的例子

加密     下面的代码实现了一个可逆加密的方法.可以用于对Cookie,QueryString等加密处理.      查看例子      VB.net代码      <%@ Page Language="vb" AutoEventWireup="false" Codebehind="EncString.<a href="http://dev.21tx.com/web/asp/" target="_blank&qu

360浏览器怎么设置多窗口和一个窗口模式?

  默认状态就是同一个浏览器下打开多个窗口的,您可以在工具----"切换到IE6多窗口模式"中去切换 1.360浏览器设置一个窗口模式: 点击顶部的菜单栏"工具",选择"切换到多标签" 2.360浏览器设置多窗口模式: 打开360浏览器,工具,选项,在常规里面,窗口:切换到IE6多窗口模式,如下图 新版的360安全浏览器依然支持多窗口和一个窗口模式.

关于Java中的继承和组合的一个错误使用的例子

关于Java中的继承和组合的一个错误使用的例子 相信绝大多数人都比较熟悉Java中的「继承」和「组合」这两个东西,本篇文章就主要就这两个话题谈论一下.如果我某些地方写的不对,或者比较幼稚,论证不清晰,欢迎大家留言指正. 什么是「组合」和「继承」 假设有2个class:A和B: 如果class A extends B 那么我们就说A继承B,A是子类,B是父类,这种情况就是继承. 如果A中有一个属性的类型为B,那么我们就说这种情况就是组合. 分别在什么情况下使用 回想一些我们一般会在什么情况下考虑这