给定功能

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是否太强大了?
有没有更好的办法 ?


[更新]
我找到了一种解决方法。

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 => BMonoid)分开。 f已经合并了这两个操作。只需使用foldLeft

08-24 17:45