在Scala中具有相同结果类型的函数的Applicative Functor实例

时间:2015-04-24 12:29:40

标签: scala

我试图在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中执行此操作?

1 个答案:

答案 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