ฉันรู้ว่าวิธีหนึ่งในการดำเนินการนี้คือการคำนวณสถานะใหม่ทุกครั้งที่มีการเปลี่ยนแปลงมาถึงอย่างไรก็ตามสิ่งนี้ดูเหมือนจะไม่จริง
หากการเปลี่ยนแปลงที่นำไปใช้เมื่อเหตุการณ์เกิดขึ้นไม่ได้กระจายในทางใดทางหนึ่งคุณจะต้องคำนวณสถานะใหม่ทุกครั้งที่มีเหตุการณ์เกิดขึ้นเนื่องจากสถานะสุดท้ายไม่ได้เป็นเพียงสถานะเริ่มต้นรวมถึงการเปลี่ยนแปลงต่อเนื่อง และแม้ว่าการเปลี่ยนแปลงนั้นเป็นแบบกระจายคุณมักต้องการเปลี่ยนสถานะเป็นสถานะถัดไปอย่างต่อเนื่องเนื่องจากคุณต้องการหยุดกระบวนการของคุณให้เร็วที่สุดเมื่อถึงสถานะที่กำหนดและเนื่องจากคุณต้องคำนวณสถานะถัดไปเพื่อพิจารณาว่า ใหม่เป็นรัฐที่ต้องการ
ในการเขียนโปรแกรมการทำงานการเปลี่ยนแปลงสถานะมักจะแสดงโดยการเรียกใช้ฟังก์ชันและ / หรือพารามิเตอร์ฟังก์ชัน
เนื่องจากคุณไม่สามารถคาดการณ์ได้ว่าสถานะสุดท้ายจะถูกคำนวณเมื่อใดคุณไม่ควรใช้ฟังก์ชันเรียกซ้ำแบบไม่หาง กระแสของรัฐซึ่งในแต่ละรัฐจะขึ้นอยู่กับก่อนหน้านี้อาจเป็นทางเลือกที่ดี
ดังนั้นในกรณีของคุณฉันจะตอบคำถามด้วยรหัสต่อไปนี้ใน Scala:
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
แปลงแต่ละคู่ให้เป็นค่าเดียวที่เป็นสถานะใหม่ซึ่งคำนวณเป็นฟังก์ชันของสถานะเก่าและเหตุการณ์ที่เกี่ยวข้อง สถานะใหม่จึงเป็นสถานะที่คำนวณก่อนหน้านี้รวมทั้งเหตุการณ์ที่เกี่ยวข้องที่ "แก้ไข" รัฐ
โดยพื้นฐานแล้วคุณกำหนดกระแสที่ไม่มีที่สิ้นสุดของรัฐแต่ละรัฐใหม่เป็นหน้าที่ของรัฐที่คำนวณล่าสุดและเหตุการณ์ใหม่ เนื่องจากลำธารขี้เกียจใน Scala (ในหมู่อื่น ๆ ) มีการคำนวณตามความต้องการเท่านั้นดังนั้นคุณไม่จำเป็นต้องคำนวณสถานะที่ไร้ประโยชน์และคุณสามารถคำนวณสถานะได้มากเท่าที่คุณต้องการ
หากคุณสนใจเฉพาะในสถานะแรกที่เคารพภาคแสดงให้แทนที่บรรทัดสุดท้ายของรหัสโดย:
states find predicate get
สิ่งที่ดึง:
res7: Double = 1.1