有没有关于如何使用这种结构类型的全面教程?

时间:2014-07-22 20:55:19

标签: scala types scalaz

如图here所示,定义了地图

  

以一种有点时髦的方式

为了完整性'为了这个代码:

implicit def FunctionFunctor[R] = new Functor[({type l[a] = R=>a})#l] {
  def map[A, B](fa: R => A)(f: A => B) : R => B = (x => f(fa(x)))
}

更具体地说 - new Functor[({type l[a] = R=>a})#l]

我确实认为我知道发生了什么,但不能诚实地说我完全理解这个概念。由于没有任何暗示,我不能谷歌这个术语(我根本不知道谷歌)。是否有一些教程(或评论,或其他)存在于更好的去除水平的解释?我更欣赏的是有人可以在答案中解释它。

1 个答案:

答案 0 :(得分:8)

这是结构类型的一种特殊情况,但称为'类型lambda',如果你搜索type lambda scala谷歌会给你一些结果。

简而言之,它的使用方式与部分应用的功能类似。

def x(a:Int, b:Int):Int = a * b
val x10 = x(10, _:Int)
x10(2) // 2

类型的示例。

type IntEither[B] = Either[Int, B]
val y:IntEither[String] // Either[Int, String]

在某些情况下,方法或类期望具有单个参数的类型

class Test[F[_]]

您无法为Test班级Either提供Test,因为Either期望带有1个参数且Either的类型有2个。为了能够传入type X[B] = Either[Int, B] new Test[X] 我们可以部分应用它

type X = {
  type T[x] = Either[Int, x]
}

new Test[X#T]

另一种写作方式是:

X

我们还可以匿名定义new Test[({type T[x] = Either[Int, x]})#T] 类型

,而不是创建类型别名
Test[Either[Int, x]]

这些都为您提供了type PartiallyTypedFunction[R] = { type T[x] = R => x } implicit def FunctionFunctor[R] = new Functor[PartiallyTypedFunction[R]#T] { def map[A, B](fa: R => A)(f: A => B): R => B = (x => f(fa(x))) } 类型的实例。


修改

您的示例可能如下所示:

{{1}}