2017-01-02 5 views
5

와 자기 사상의 컬렉션을 배하는 방법 g내가 꽤 일반적인 콤비를 작성하려합니다</p> <pre><code>def f(i: I) : S => S </code></pre> <p>기능을 감안할 때 고양이

def g(is : Seq[I], init: S) : S 

쉬운 구현은 고전적인 스칼라를 사용

def g(is : Seq[I], init: S) : S = 
    is.foldLeft(init){ case (acc, i) => f(i)(acc) } 

Foldable을 사용하려고했지만 컴파일 문제가 발생했습니다. .

  1. 이 있습니까 고양이
  2. 0에서 자기 사상의 Monoid :

    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] 
    

    은 제가 몇 가지 질문이

    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 
    

    State 성공

  3. 모든 import 문을 함께 사용하면 편집 문제를 설명 할 수 있습니까? 올바른 수입을 쉽게 찾을 수있는 트릭이 있습니까?
  4. State은이 경우 너무 강력한 추상화입니까?
  5. 더 좋은 방법이 있습니까?

내가 1

type Endo[S] = S => S 
def g(is : Seq[I], init: S) : S 
    = Foldable[List].foldK[Endo, S](dirs.toList.map(f _)) 

에 대한 해결 방법을 발견했습니다하지만 여전히 foldMapK이 상용구를 피하기 위해 [업데이트] ...

+0

당신은'Monoid' 인스턴스를 직접 지정할 수 있습니다 :'Foldable [List] .foldMap (is.toList) (f _) (MonoidK [Endo]. 대수) (init)' –

답변

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은 이미이 두 작업을 병합했습니다. foldLeft을 사용해주세요.

+0

왜 B가 될 수 없는가 S = > S? –

+0

물론,'(S => S) => (S => S) => (S => S)'가 필요합니다. – Reactormonk

+0

고양이에 Monoid [S => S]의 인스턴스가 있습니까? –