Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 将M[A=>;B]转换为A=>;M[B]_Scala_Functional Programming_Scalaz - Fatal编程技术网

Scala 将M[A=>;B]转换为A=>;M[B]

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) =&

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) => 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这是最干净、最清晰的实现。