Scala 将M[A=>;B]转换为A=>;M[B]
Scala或Scalaz中是否存在将函数的容器/集合转换为从相同输入映射到集合输出值的函数的实用程序?签名看起来像Scala 将M[A=>;B]转换为A=>;M[B],scala,functional-programming,scalaz,Scala,Functional Programming,Scalaz,Scala或Scalaz中是否存在将函数的容器/集合转换为从相同输入映射到集合输出值的函数的实用程序?签名看起来像 def transform[M[_], A, B](m: M[A => B]): A => M[B] = ??? 下面是列表容器的示例实现: def transform[A, B](fs: List[A => B]): A => List[B] = x => fs.foldRight[List[B]](Nil) { (f, acc) =&
def transform[M[_], A, B](m: M[A => B]): A => M[B] = ???
下面是列表容器的示例实现:
def transform[A, B](fs: List[A => B]): A => List[B] = x =>
fs.foldRight[List[B]](Nil) {
(f, acc) => f(x) :: acc
}
理想情况下,这适用于任何函数容器,包括一个函数元组、一个选项[Function1[a,B]]
,甚至一个元组[Option[Function1[a,B]],…]
编辑:
我刚刚意识到(至少对于列表的特殊情况)map函数可以工作:
def transform[A, B](fs: List[A => B]): A => List[B] = x => fs map (_(x))
这可以推广到任何具有适当语义的map函数的对象。什么类型的类适合这个?我搜索了Scalaz源代码,它看起来像是
Functor
完成了以下任务:
def transform[M[_]: Functor, A, B](fs: M[A => B]): A => M[B] = a => fs map (_(a))
假设
M
是一个函子,scalaz的Functor
中的mapply
具有类似的类型签名:
def mapply[A, B](a: A)(f: F[A => B]): F[B] = map(f)((ff: A => B) => ff(a))
因此,您可以根据以下内容编写转换:
def transform[M[_],A,B](m: M[A => B])(implicit f:Functor[M]):A => M[B] = f.mapply(_)(m)
编辑:另一个使用FunctorSyntax
功能的实现:
def transform[M[_]:Functor,A,B](m: M[A => B]):A => M[B] = _.mapply(m)
有趣。我刚刚发现了函子,并在下面添加了一个答案。使用
mappy
而不是map
有什么好处吗?它们是两个不同的函数,但是,mappy
可以用map
来编写。如果您将fs
更改为f
并在实现中展开占位符,您将看到它基本上与mappy
相同的实现:f map((ff:A=>B=>ff(A))
,而不是map(f)((ff:A=>B=>ff(A))
我之前的评论是针对“map和mapply之间有什么区别?我记得你最初的评论是这样写的。好处是代码重用(参见编辑).transform
本质上是mapply
并重新排列了参数。是的,我重新编写了它以使我实际要求的内容更清楚。特别是,我不喜欢显式添加函子参数列表的冗长,但我喜欢它更接近无点样式的方式。您最近的编辑是defini这是最干净、最清晰的实现。