前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Scala typeclass 设计模式

Scala typeclass 设计模式

作者头像
Ldpe2G
发布2018-07-09 14:56:51
3810
发布2018-07-09 14:56:51
举报

前言

 本文的写作的灵感主要是看了这个视频 : Tutorial: Typeclasses in Scala with Dan Rosen

加上查阅了相关的资料,觉得可以写一篇博客,再加上也很久没写博客了。本文的主要内容是根据参考资料

对typeclass的解释再加上自己的一点点理解,代码会借(cao)鉴(xi)资料中的例子(不过代码会稍作修改)。

正文

typeclass定义

  首先简单看看维基上对于typeclass的定义:"In computer science, a type class is a type system 

construct that supports ad hoc polymorphism." 这个“ad hoc polymorphism”(特质多态)其实也被

称作函数重载或运算符重载。

  在scala中采用typeclass模式有什么有优点呢?总的来说就是:代码易扩展;代码写得好看。

在例子中理解 typeclass

  以下用到的代码均借鉴自[2] 。

首先我们来看看两个 ADT 的定义:

  就是定义了一个表达式ADT,还有Json ADT。

   然后还有给表达式赋值的和输出Json的两个object :

       简单测试一下:

     然后现在想添加一个功能,就是给定某个类型的对象,获得该对象的json字符串。面向对象的做法是

声明一个JsonConvertible接口,然后让有需要类型去继承该接口,实现 convertToJson 方法。

  现在想让Expression类型的对象都能转成Json类型,那么就是每个Expression类型都要去实现

converToJson方法。

  然后我们可以简单测试一下:

  然后现在问题来了,我们想保持Expression接口尽量的轻量,不想有太多的依赖,而且如果现在又要增加

一个新的trait那么Number、Multiply和Divide三个类又要去实现这个接口的方法。或者如果Expression是属于

第三方的库,无法修改来继承JsonConvertible怎么办?

  这时候继承多态不适用了,我们要用特质多态来解决这个问题。

  我们先来看看新的write函数定义,现在我们新加了一个helper类JsonConverter,这个类实现了

把value转化为Json类型的方法。然后我们来看看现在这么做的好处:

      我们可以看到,现在Expression可以保持原来的样子,并且把Expression转化为Json的逻辑与

Expression的实现分开了。简单测试一下:        

  so far so good。但是现在想再进一步使实现更简洁一些,这个JsonConverter其实并不一定要

显式的传入,我们可以借助scala的implicit来实现。

  就是在原来的基础上作些小修改,把expressionJsonConverter改为implicit,还有write函数

改为curry,conv参数改为implicit。简单测试一下:

      更进一步我们可以用scala中的context bound来改写代码。

      context bound 的表达形式是 A : B,意思是在上下文中存在隐式的 B[A] 类型的对象。刚开始

接触的时候我觉得context bound 和 view bound很像, A <% B,view bound的意思你可以把

A当作B来用,上下文中需要存在一个A到B的隐式转换。

  ok,到此就是scala type class的简单介绍,视频中后面还有关于Expression和Json的重构并扩展到

Int和Tuple上,有兴趣的可以看看。    

相关资料

[1] What are type classes in Scala useful for?

[2] Tutorial: Typeclasses in Scala with Dan Rosen

[3] The Neophyte's Guide to Scala Part 12: Type Classes

[4] Type class

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 正文
    • typeclass定义
      • 在例子中理解 typeclass
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档