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