加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 将M [A => B]变换为A => M [B]

发布时间:2020-12-16 10:04:25 所属栏目:安全 来源:网络整理
导读: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.f
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,…].

编辑:

我刚刚意识到(至少对于List的特殊情况)map函数是有效的:

def transform[A,B](fs: List[A => B]): A => List[B] = x => fs map (_(x))

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

解决方法

假设M是一个Functor,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[_],B](m: M[A => B])(implicit f:Functor[M]):A => M[B] = f.mapply(_)(m)

编辑:使用FunctorSyntax中的功能的另一个实现:

def transform[M[_]:Functor,B](m: M[A => B]):A => M[B] = _.mapply(m)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读