5

与えられた関数

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

いくつか質問があります:

  1. Monoid猫の自己同型性はありますか
  2. importすべてのステートメントを一緒に使用した場合のコンパイルの問題を説明できますか? 適切なインポートを簡単に見つけるためのトリックはありますか?
  3. Stateこの場合、抽象化は強力すぎますか?
  4. より良い方法はありますか?

[更新] 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>

4

1 に答える 1

3

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これら 2 つの操作は既にマージされています。を使用するだけfoldLeftです。

于 2017-01-02T20:18:14.457 に答える