나는 이것을 구현하는 한 가지 방법은 변화가 도착할 때마다 상태를 재 계산하는 것임을 알고 있지만, 이것은 비현실적 인 것 같습니다.
이벤트가 발생할 때 적용된 변경 사항이 어떤 방식 으로든 분산되지 않는 경우 최종 상태는 초기 상태에 지나지 않고 연속적인 변경 사항이므로 이벤트가 발생할 때마다 상태를 다시 계산해야합니다. 그리고 변경 사항이 분산 적이라하더라도 주어진 상태에 도달하는 한 빨리 프로세스를 중지하고 다음 상태를 계산하여 다음 상태를 결정해야하므로 일반적으로 상태를 다음 상태로 연속 변환하려고합니다. 새로운 것은 원하는 상태입니다.
함수형 프로그래밍에서 상태 변경은 일반적으로 함수 호출 및 / 또는 함수 매개 변수로 표시됩니다.
최종 상태가 언제 계산되는지 예측할 수 없으므로 비 꼬리 재귀 함수를 사용하지 않아야합니다. 각 상태가 이전 상태를 기반으로하는 상태 스트림이 좋은 대안이 될 수 있습니다.
따라서 귀하의 경우 스칼라에서 다음 코드로 질문에 대답합니다.
import scala.util.Random
val initState = 0.0
def nextState(state: Double, event: Boolean): Double = if(event) state + 0.3 else state - 0.1 // give a new state
def predicate(state: Double) = state >= 1
// random booleans as events
// nb: must be a function in order to force Random.nextBoolean to be called for each element of the stream
def events(): Stream[Boolean] = Random.nextBoolean #:: events()
val states: Stream[Double] = initState #:: states.zip(events).map({ case (s,e) => nextState(s,e)}) // a stream of all the successive states
// stop when the state is >= 1 ;
// display all the states computed before it stopped
states takeWhile(! predicate(_)) foreach println
예를 들어 어떤 결과를 줄 수 있습니까?
0.0
0.3
0.2
0.5
0.8
val states: Stream[Double] = ...
연속적인 상태가 계산되는 라인입니다.
이 스트림의 첫 번째 요소는 시스템의 초기 상태입니다. zip
상태 스트림을 이벤트 스트림과 요소 쌍의 단일 스트림으로 병합합니다. 각 쌍은 (상태, 이벤트)입니다. map
각 쌍을 새 상태 인 단일 값으로 변환하고 이전 상태 및 관련 이벤트의 함수로 계산합니다. 따라서 새로운 상태는 이전에 계산 된 상태와 상태를 "수정"하는 관련 이벤트입니다.
따라서 기본적으로 잠재적으로 무한한 상태 스트림을 정의합니다. 각 새로운 상태는 마지막 계산 된 상태의 함수이며 새로운 이벤트입니다. 스칼라에서는 스트림이 느리기 때문에 (주문형으로 만) 계산되므로 필요없는 상태를 계산할 필요가 없으며 원하는 수의 상태를 계산할 수 있습니다.
술어를 존중하는 첫 번째 상태에만 관심이있는 경우 마지막 코드 행을 다음으로 바꾸십시오.
states find predicate get
어떤 검색 :
res7: Double = 1.1