2017-10-12 14 views
1

나는 스칼라의 고양이 라이브러리, 특히 State Monad를 살펴 보았습니다.고양이에서 StateMonad 시퀀싱

object Splitter { 
    def apply(maxSize: Int, overlap: Int): State[StringBuilder, String] = State(
    builder => { 
     val splitPoint = math.min(builder.size, maxSize + overlap) 
     (builder.drop(maxSize), builder.substring(0, splitPoint)) 
    } 
) 
} 

는 국가 모나드 작업의 한 단계를 실행 : 내가 분할 문자열 나머지 모두 StringBuilder를 잠재적으로 큰 문자열 (모두 StringBuilder를) 분할 및 반환 몇 가지 논리를 만들고 싶었 장난감 예를 들어

val stop = State.inspect((s: StringBuilder) => s.isEmpty) 
Splitter(3, 2).untilM[Vector](stop).run(new StringBuilder("tarsntiars")) 

그러나,이 untilM대로 작동하지 않습니다

는 모나드 특성의 구성원 및 범위에는 암시 적 변환이없는 : 모두 StringBuilder 결국 빌 때까지 잘하지만 난 체인의 모든 단계를 원했다. 무엇 작동 것은 그러나

val monad = StateT.catsDataMonadForStateT[Eval, StringBuilder] 
monad.untilM[List, String](Splitter(3, 2))(stop).run(new StringBuilder("tarsntiars")) 

, 나는 짧은이 작동하지 않는 이유 그래서 궁금 훨씬 더 읽을 생각하십니까? 일반적인 MonadOps 메커니즘이 여기서 왜 작동하지 않습니까?

+0

"정지"란 무엇입니까? – mtk

+0

정지의 정의를 추가했습니다. – peri4n

답변

1

SI-2712가 수정 된 후 Unapply 해결 방법이 Cats : https://github.com/typelevel/cats/pull/1583에서 제거되었습니다. StateMonad으로 처리되도록하려면 이제 -Ypartial-unification 컴파일러 플래그 (스칼라 2.11 또는 2.12를 사용한다고 가정)가 필요합니다.

Scalaz에는 여전히 Unapply 기계가 있으므로 컴파일러 플래그없이 Scalaz에서 코드가 작동해야합니다.

+0

답변 해 주셔서 감사합니다. 이것이 받아 들인 대답이기 때문에 IntelliJ IDEA에서 구문 강조 표시를 해제한다고 덧붙이고 싶습니다. https://youtrack.jetbrains.com/issue/SCL-11320 – peri4n

+0

2.11.9 이전에 스칼라 2.11 버전을 사용하고 있거나 스칼라 2.10을 사용하고 있다면 주목할만한 가치가 있습니다. https://github.com/fiadliel/sbt-partial-unification (보너스 : 지원되는 버전을 사용하는 경우 플러그인에서 플래그를 활성화 만합니다)을 사용하여 부분 통일 수정을 활성화 할 수 있습니다. –