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

scala – 如何折叠猫的内同态集合

发布时间:2020-12-16 18:36:52 所属栏目:安全 来源:网络整理
导读:给定一个功能 def f(i: I) : S = S 我想写一个非常常见的组合g def g(is : Seq[I],init: S) : S 简单的实现仅使用经典scala def g(is : Seq[I],init: S) : S = is.foldLeft(init){ case (acc,i) = f(i)(acc) } 我试图使用Foldable但我遇到了编译问题. import
给定一个功能

def f(i: I) : S => S

我想写一个非常常见的组合g

def g(is : Seq[I],init: S) : S

简单的实现仅使用经典scala

def g(is : Seq[I],init: S) : S = 
  is.foldLeft(init){ case (acc,i) => f(i)(acc) }

我试图使用Foldable但我遇到了编译问题.

import cats._
import cats.Monoid
import cats.implicits._
def g(is : Seq[I],init: S) : S = 
  Foldable[List].foldMap(is.toList)(f _)(init)

错误是

could not find implicit value for parameter B: cats.Monoid[S => S]

我成功地接受了国家

import cats.data.State
import cats.instances.all._
import cats.syntax.traverse._

def g(is : Seq[I],init: S) : S = 
  is.toList.map(i => State.modify(f(i))).sequenceU.runS(init).value

我有一些问题 :

>猫是否有一个用于内胚胎的Monoid
>当我一起使用所有import语句时,你能解释编译问题吗?有没有一个技巧可以轻松找到正确的导入?
>在这种情况下,State是一个过于强大的抽象吗?
>有更好的方法吗?

[更新]
我找到了1的解决方法.

type Endo[S] = S => S
def g(is : Seq[I],init: S) : S 
  = Foldable[List].foldK[Endo,S](dirs.toList.map(f _))

但我仍然是一个foldMapK,以避免样板…

解决方法

foldMap在这里不起作用,因为你的f是I => S => S,与foldMap的签名不匹配:

def foldMap[A,B](fa: F[A])(f: (A) ? B)(implicit B: Monoid[B]): B

你需要你的A => B和B => B => B(Monoid)分开. f已经合并了这两个操作.只需使用foldLeft.

(编辑:李大同)

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

    推荐文章
      热点阅读