gpt4 book ai didi

scala - 将 M[A => B] 转换为 A => M[B]

转载 作者:行者123 更新时间:2023-12-04 18:43:04 25 4
gpt4 key购买 nike

Scala 或 Scalaz 中是否存在将容器/函数集合转换为从相同输入映射到集合输出值的函数的实用程序?签名看起来像

def transform[M[_], A, B](m: M[A => B]): A => M[B] = ???

下面是 List 容器的示例实现:
def transform[A, B](fs: List[A => B]): A => List[B] = x =>
fs.foldRight[List[B]](Nil) {
(f, acc) => f(x) :: acc
}

理想情况下,这适用于任何函数容器,包括函数元组, Option[Function1[A, B]] ,甚至是 TupleN[Option[Function1[A, B]], ...] .

编辑:

我刚刚意识到(至少对于 List 的特殊情况) map 函数有效:
    def transform[A, B](fs: List[A => B]): A => List[B] = x => fs map (_(x))

这可以推广到任何具有具有适当语义的 map 函数的东西。什么是合适的类型类?

最佳答案

假设 M是仿函数,mapply在 scalaz 的 Functor有一个类似的类型签名:

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)

关于scala - 将 M[A => B] 转换为 A => M[B],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20648007/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com