gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:52:33 24 4
gpt4 key购买 nike

给定一个函数

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] 

我成功了 State
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在这里无法工作,因为您的 fI => S => S , 与 foldMap 的签名不匹配:

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

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

    关于scala - 如何折叠与猫的内同态集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41430583/

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