与えられた関数
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>