2014-12-08 2 views
3

나는 기능적인 방식으로 자기 수정 기능을 표현하고 싶기 때문에 국가 모나드를 고려하게되었다. "Functional Programming in Scala"서적은 본질적으로 S => (R, S) 함수의 경우 클래스 래퍼입니다. 여기서 S는 상태이고 R은 결과입니다.State Monad를 자체 수정 기능으로 사용할 수 있습니까?

trait RNG { 
    def nextInt : Int 
} 

case State[S,R](run : S => (R,S)) { /* other details omitted */ } 

type Rand[R] = State[RNG,R] // `random generator of R' 

우리가 RNG합니다 ('상태'부분) 이외의 다른 매개 변수를 필요로하지 않기 때문에 그래서 모두가 잘 작동하는 R을 반환을합니다 ('결과'부분을 다음과 같이 예를 들어,이 난수 생성기와 함께 작동). 자동 수정 기능에 대한

는 욕망은 다음의 더 구문 - 설탕 버전으로 올 상태 모나드를 사용하는 것입니다

trait Fn[A,R] { 
    def apply(a: A): (R,Fn[A,R]) 
} 

이 이상적 map과 함께 할 것입니다 flatMap 메소드 (Scala의 표기법을 통해 자동으로 sugared 될 수 있음).

그러나, 랜드의 예와는 달리, Fn을 이런 종류의 물건은 여전히 ​​상태 모나드를 사용하여 표현할 수있는 A 형

의 인수를인가한다? 그렇지 않은 경우에도 여전히 monand로 표현할 수 있습니까? 그렇다면지도 또는 flatMap 중 기본으로 간주되는 것을 어떻게 작성합니까?

*이 마지막 점은 FPiS 모나드 특성이지도를 기본 연산으로 처리하기 때문에 나타납니다.

답변

3

괜찮을 것입니다. 명백한 접근 방식은 작동합니다 :

def applyState[A, R](a: A) = State(fn: Fn[A, R] => fn.apply(a)) 

val composedState = for { 
    firstResult <- applyState[Int, Thingy](2) 
    secondResult <- applyState[Int, Thingy](4) 
} yield secondResult 

composedState.run(new Fn[Int, Thingy]{...}) 
+0

고마워요. 이것은 for 문 본문 내에 State 인스턴스를 만들려는 경우에 효과적입니다. 주 (state)가 for for the outside 외부에서 생성되고 for가 반복적으로 호출되는 경우와 동일한 간단하고 우아한 관용구가 있는가? – NietzscheanAI

+0

반복해서 무엇을 의미합니까? 외부의 상태로 <- 구문을 사용하거나 flatMap 및 친구를 직접 사용할 수 있습니다. 구조가 완성 될 때까지 어떤 종류의 루핑을 원한다면 Monad의 메소드를 살펴보십시오. – lmm