나는 기능적인 방식으로 자기 수정 기능을 표현하고 싶기 때문에 국가 모나드를 고려하게되었다. "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 모나드 특성이지도를 기본 연산으로 처리하기 때문에 나타납니다.
고마워요. 이것은 for 문 본문 내에 State 인스턴스를 만들려는 경우에 효과적입니다. 주 (state)가 for for the outside 외부에서 생성되고 for가 반복적으로 호출되는 경우와 동일한 간단하고 우아한 관용구가 있는가? – NietzscheanAI
반복해서 무엇을 의미합니까? 외부의 상태로 <- 구문을 사용하거나 flatMap 및 친구를 직접 사용할 수 있습니다. 구조가 완성 될 때까지 어떤 종류의 루핑을 원한다면 Monad의 메소드를 살펴보십시오. – lmm