Scala中的Typeclass模式实例-转载于BitTiger.io
来源:互联网 发布:c语言a =b 编辑:程序博客网 时间:2024/06/11 17:01
Scala中的Typeclass模式实例
Typeclasses,(或者 type classes) 模式源自Haskell, 但是在Scala语言中得到了广泛应用并发扬光大.
What is a type class and why do we need it ?
Type classes are useful to solve several fundamental challenges in software engineering and programming languages. In particular type classes support retroactive extension: the ability to extend existing software modules with new functionality without needing to touch or re-compile the original source. [1]
在Scala 包中已经包含了几个由typeclasses实现的包,这包括scala.math.Numeric 跟 scala.math.Ordering。 但是在ScalaZ的中,所有的library都是基于typeclasses实现的。
Scala中使用traits和 implicits 可以实现typeclasses模式。 与Haskell相比,Scala中typeclasses的实现虽然繁琐一些,但同时也带来了极大的灵活性。在Haskell中只允许单一typeclasses实例化的全局创建,然而在Scala中几乎可以不束缚于创建数量的限制。
此外,在Scala中如果在上下文中找不到合适的typeclasses的实现,也可以指定默认的实现。我们通过下文的例子来看下Scala中如何实现typeclasses的模式。
Show me the Code!
首先我们来定义一个叫Transformer的单例对象,并且给这个Transformer类添加一个T => R的方法叫transform.
其次,我们要实现下transform的具体方法, 例如我们想完成一个从Int => String的转换, 这时我们可以通过implicit关键字来定义隐身转换的方法.
如果你仅仅认为typeclasses模式只能做单一类型的转换那就错了, 我们同样可以做容器类型的转换。举个例子,还是根据上文给的例子我们想做List[T] => String的转换, 为了做这个容器List[T] 到String的转换, 我们还需要一个从T => String的转换。同样,我们可以通过定义我们的隐式转换来实现:
如何理解上文中的代码呢? 首先我们用implicit定义了一个隐式转换的方法叫ListToStringTransformer[T],同时,作为传入参数tToString, 也需要定义一个隐式转换类型Transformer[T, String]。 这样做的好处就是,你的参数可以不用显示的指明来传入,Scala的compiler会去自动搜索你的上下文找到相对应的这个类型的参数。 最后,我们在ListToStringTransformer中需要具体的实例化我们传入的的Tranformer类,并复写transform方法。
接下来,我们要使用下我们之前定义的Transform typeclasses。我们可以通过定义一个Transform trait来实现。trait的命名完全等同于我们之前定义的typeclasses Transform。
上图中的trait的transform方法中,有两个传入参数, 第一个传入参数为t,其类型为T。 可以显示的声明传入; 第二个传入参数是被implicit修饰的transformer,其类型为Transformer[T,R],而这个transformer参数被隐式传入。 当这个方法被调用时, Scala的编译器会根据你第一个传入的数据类型为T的t,结合从上下文找到相应类型为T的transformer来调用, 也就是用来调用相应的transformer.transform(t)方法。
最后我们来调用下我们定义的typeclasses, 通过以下示例:
从Boolean => String的转换,
总结:
我们在定义typeclasses的时候要注意到3部分:
首先定义type class本身, 是个generic的trait.
我们需要实例化我们想要实现的具体类型
我们同时也要定义一个或多个的接口方法来实现(这里的接口方法可以定义到object中)
Reference
"Type Classes as Objects and Implicits"; Bruno C. d. S. Oliveira, Adriaan Moors, Martin Odersky
- Scala中的Typeclass模式实例-转载于BitTiger.io
- scala中的io使用
- haskell中的typeclass和类型系统
- Scala中的模式匹配
- scala 文件io和md5实例
- 【Scala】Scala中的match、case模式匹配
- Scala中的模式匹配match
- 观察者模式本文纯属于转载
- scala学习:scala中的模式匹配入门实战
- scala学习笔记:变量声明中的模式
- scala中的正则匹配和模式匹配
- java io中的Decorator模式
- Java IO 中的设计模式
- Java IO 中的设计模式
- Java io 中的设计模式
- java.io.* 中的设计模式
- IO中的一种设计模式
- Java IO 中的设计模式
- HDU 5531(Rebuild- 三分)
- qmake Variable Reference
- 狮子搏兔 亦用全力
- 《信号与系统》01 信号运算
- 调用 WinSCP 下载远程服务器文件 Python
- Scala中的Typeclass模式实例-转载于BitTiger.io
- struts2源码分析及拦截器实现原理
- Apple WatchKit 初探
- 12.7 1602液晶的读写时序介绍
- 12.8 1602液晶指令介绍
- 12.9 1602液晶简单显示程序
- 13.1 通信时序解析
- window、ubuntu与arm板文件挂载
- 13.2 1602整屏移动