给定一个函数
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
要避免样板……</p>