给定功能
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
在这里不起作用,因为您的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
。