高级类类型就是使用其他类型构造成为一个新的类型,因此也称为 类型构造器(type constructors)。它的语法和高阶函数(higher-order functions)相似,高阶函数就是将其它函数作为参数的函数;高级类类型则是将构造类类型作为参数类型。一个高级类类型可以有一个或者多个类型作为参数。在Scala中,你可以使用type关键字声明,如下:

这里定义了一个高级类类型Callback,该类型接收一个类型 T,并构造一个新的类型Function1。类型Callback不是一个完整的类型,直到它实现了参数化。

Function0,Function1,... 表示接收类型个数1,2,3,... ,如Function0[A],Function1[A,B]... ,一共23个FunctionX。用于定义匿名语法,实现语法糖。

高级类类型可以用于创建复杂类型,如M[N[T,X],Y],但可以看作更简单的类型,F[X]。

Higher-kinded types

除了上面说的用关键字type定义的类型外,高级类类型最常见的实现是使用占位符代替。即F[_],在Scala中,占位符 _ 有特别的意义,可以表示任何东西。

User Story

如我们要实现一个sum方法,该方法可以接收任何Scala集合类型,并实现加法处理。我们可能实现的一种方式是,为所有集合类型定义相对应的方法:

但这并不是一个高效的函数实现,我们要对所有集合类型进行抽象,以使得sum方法可以接收任何集合类型。因此,我们要实现高级类类型。

现在,我们分别为不同的类型实现该特质:

现在,我们要为这个抽象的类类型,实现抽象的方法:

它接收所有集合类型,现在我们为其实现具体的实现:

根据这个特质,我们现在可以实现其通用的函数sum,该函数接收三个参数:集合、Foldable特质、Summable特质,如下:

执行这个方法,打印输出:

好了,我们的高级类类型就已经实现了。但是等等,上面这个函数看起来很死板,我为什么要接收三个参数呢,有没有sum(List(1,2,,3)) sum(Array("one", "two", "three"))这样的实现?有!

Scala有个强大的特性就是隐式调用,我们需要实现这个sum函数的隐式调用,修改如下:

上面的写法实际上和下面是同价的:

修改上述sum函数,让其只接收一个参数:

SBT控制台执行上述代码,便可以得到相同的结果。 

Scala的高级类类型很有用,并且用途广泛,下面我们看看一个Java Servlet到Scala Servlet的一个转换框架Scalaz。

Scalaz核心实现

Scalaz的核心部分很简单,该框架的核心就是实现了所有HTTP请求和响应的抽象。即,把所有的HTTP请求抽象为一个Request特质,所有响应也抽象为一个Response特质。我们看看这个抽象实现的核心代码:

没错,这里的Application,对应Java Servlet里面的application,其中IN[]和OUT[]的实现为Request[IN] => Response[OUT],即抽象请求处理后,返回抽象响应。这个方法实现了高级类类型(higher-kinded types),该方法实现了输入到输出的所有转换,这里的f函数为一个高阶函数实现。

通过高级类类型,结合高阶函数,函数组合,并结合相应的隐式转换和语法糖,Scalaz框架便由此诞生了!!

https://my.oschina.net/Barudisshu/blog/690595

Scala类型系统——高级类类型(higher-kinded types)相关推荐

  1. scala和java类_Scala(和Java)中的类和类型有什么区别?

    当你说"打字"时,我会假设你的意思是静态类型.但我很快就会讨论动态类型. 静态类型是程序的一部分的属性,可以静态证明(静态意味着"不运行它").在静态类型语言中 ...

  2. java高级类型_Java第四章高级类属性一

    四.高级类属性一: 一.== 1. 基本数据类型,根据基本数据类型的值判断是否相等,相等返回true,反之返回false 注:两端数据类型可以不同,在不同的情况下,也可以返回true 2.引用数据类型 ...

  3. Scala类型系统的目的——Martin Odersky访谈(三)

    Martin Odersky向Frank Sommers和Bill Venners谈论Scala类型系统背后的设计动机. \\ Scala是一种新兴的通用用途.类型安全的Java平台语言,结合了面向对 ...

  4. javascript类型系统——正则表达式RegExp类型

    原文:javascript类型系统--正则表达式RegExp类型 × 目录 [1]对象 [2]实例属性 [3]静态属性[4]实例方法 前面的话 前面已经介绍过javascript中正则表达式的基础语法 ...

  5. scala 抽象方法_Scala抽象类型

    scala 抽象方法 The type whose identity is not known precisely can be termed as abstract type. 身份未知的类型可以称 ...

  6. Scala(三):类

    类:Class 1.简单类和无参方法 2.带getter和setter属性 3.只带getter属性 4.对象私有字段 5.Bean属性 6.辅助构造器 7.主构造器 8.嵌套类 1.简单类和无参方法 ...

  7. 分析 C# 2.0 新特性 -- 空类型(Nullable Types)

    分析 C# 2.0 新特性  -- 空类型(Nullable Types) 在讨论C# 2.0 空类型前,先回顾一下.NET 1.0和.NET 1.1对于类型有下面这样的定义: ".NET  ...

  8. scala使用java类_使用Java和Scala将Play Framework 2应用程序部署到Openshift

    scala使用java类 几个星期, 马克·阿特伍德 ( Mark Atwood) , 豪尔赫·艾利斯 ( Jorge Aliss )和我塞巴斯蒂安 ·斯卡塔诺 ( SebastiánScarano) ...

  9. Scala系列-3、scala中的类和对象有哪些?

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 传送门:大数据系列文章目录 目录 如何使用IDEA创建scala项目 创建普通的scala项目 ...

最新文章

  1. 0409-0416的笔记
  2. 老板:kill -9 的原理都不知道就敢去线上执行?明天不用来了
  3. 如何定义和实现一个类的成员函数为回调函数
  4. insert with special ID
  5. 【网络流】植物大战僵尸(P2805)
  6. Node.js 连接 MySQL 并进行数据库操作
  7. 角速度求积分能得到欧拉角吗_高中物理竞赛典型例题精讲——中垂平面内电荷圆周运动角速度...
  8. 谁说男生不能美美哒?2020中国男士美妆市场洞察报告.pdf(附下载链接)
  9. C# Winform编程ListBox之DrawItem事件
  10. 20200221_2_国家非文化遗产聚类分析
  11. 实现MFC扩展DLL中导出类和对话框
  12. 快逸报表为报表添加无数据的日期(二)
  13. 计算机无法创建新文件夹,无法创建文件,小编教你无法新建文件夹怎么办
  14. 分享一个好用的图片压缩软件
  15. I don't know her
  16. python绘图设置正交坐标等距_python – 使用cartopy在其他项目中绘制投影数据
  17. Python Matplotlib设置x轴与y轴相交于心仪的坐标点
  18. Laravel 报错 failed to open stream 的解决方法
  19. 吐槽CH569相关资料
  20. python+jieba分析唐诗三百首

热门文章

  1. ionic + cordova+angularJs 搭建的H5 App完整版总结
  2. 解决eclipse ctrl+鼠标左键不能用
  3. P2P最易遭受的DDoS***以及防御手段
  4. 《Objective-c》Foundation框架 -(字符串:NSString和NSMutableString)
  5. 图像处理工具包ImagXpress的多页TIFF编辑API的使用(1)
  6. {} 与 function() { } , 选用空对象{}来存放keyValue
  7. 上网行为管理产品选型简单考量
  8. 路印协议受邀参加澳洲新南威尔士政府孵化器Haymarket HQ分享论坛
  9. docker 基本操作Ⅲ
  10. iOS富文本字符串AttributedString详解