我试图在Scala中为具有相同初始类型的函数实现函子和应用程序实例。我目前对两个类型类的实现是:
trait Functor[F[_]] {
def fmap[A,B](f: A => B): F[A] => F[B]
}
trait Applicative[F[_]] extends Functor[F] {
def pure[A](a: A): F[A]
def apply[A,B](f: F[A => B]): F[A] => F[B]
}
我遇到的问题是Function1
有两个类型参数,我想我不能只修复其中一个。是否可以在Scala中执行此操作?
答案 0 :(得分:3)
一种方法是使用类型别名:
def FunctionFunctor[X] = {
type F[Y] = Function[X,Y]
new Functor[F] {
def fmap[A,B](f: A => B) = (fa: F[A]) => f.compose(fa)
}
}
注意def
,因此您需要为每种特定的X
类型创建新的仿函数实例。
其他方法是使用lambda类型,它有一个有趣的语法:
def FunctionFunctor[X] = new Functor[({type F[Y] = Function[X,Y]})#F] {
def fmap[A,B](f: A => B) = (fa: Function[X,A]) => f.compose(fa)
}
尝试阅读类型lambdas,如果你不熟悉它,可能是一个模糊的概念。好的阅读是Scala in Depth