【scala类型系统】type lambda函数视角看待类型系统的高阶特性

本文介绍了类型构造器和高阶函数的概念,通过实例展示了如何用一阶类型和一阶函数表示List,以及如何通过高阶函数List2实现类型构造器的泛型。在实例1中,演示了如何定义和调用带有类型构造器的泛型函数foo。在实例2中,详细解释了如何使用高阶类型表示具有一参数的函数,并通过类型投影完成函数参数的封装。这些概念和实践对于理解和运用函数式编程语言的高级特性至关重要。
摘要由CSDN通过智能技术生成

1. 一阶类型用一阶函数来实现

List是一个类型构造器,接受一个proper type参数,生成一个proper type

class List[T] // 一阶类型
List: (T) => List[T] // 一阶函数
    * -> * // kind表示

2. 高阶类型用高阶函数来实现

List2是一个高阶函数,接受一个类型构造器,生成一个proper type

class List2[C[_]] // 高阶类型
List2: (T => C[T]) => List2[C]
    (* -> *) -> * // kind表示

3. 实例1

// 定义一个高阶函数,带类型构造器的泛型类型
def foo[M[_]](f: M[Int]) = f
foo[List](List(1,2,3)) // 带类型参数,指定具体类型
foo(List(1,2,3)) // 省略类型参数,具体类型交给编译器推断

4. 实例2

foo((x: Int) => println(x)) // 修改函数参数,使其通过编译

  1. 使用高阶类型表示函数参数
    (x: Int) => println(x)相当于匿名函数,类型为Int => Unit
  2. 匿名函数Int => Unit相当于输入参数为1的函数,类型为Function1[Int, Unit],输入类型需要抽象,即Function[Y, Unit]
  3. 对于Function[Y,Unit],类型参数有两个,而foo函数仅1个类型参数,需要对Function1进行封装,仅暴露1个参数类型给foo,
    ({type X[Y] = Function1[Y, Unit]})#X
    type X[Y] = Function1[Y, Unit]中的X[Y]表示类型别名
    ({type X[Y] = Function1[Y, Unit]})#X表示定义了一个结构类型(匿名类),使用类型投影(…)#X调用其中的类型X
    foo[ ( { type X[Y] = Function1[ Y,Unit ] })#X ]((x: Int) => println(x))
    相似的,在类型声明中可以使用结构类型定义一个临时类型X,并使用类型投影(…)#X调用这个临时类型X
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鱼摆摆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值