gpt4 book ai didi

scala - 如何在函数式编程中管理状态的层次结构?

转载 作者:行者123 更新时间:2023-12-02 00:52:55 26 4
gpt4 key购买 nike

假设我有一个 Student 类,它有很多 Action :

final case class Student(name: String, knowledge: List[String]) {
def learn(item: String) : Student = this.copy(knowledge = knowledge :+ item)
}

在这里你可以注意到这个类不受任何外部状态的影响。

但是如果我把这个类放到有状态的环境中(比如 School):

final case class School(students: Map[String, Student]) {
def learn(studentName: String, item: String) : State[School, Student] = State {
oldSchool => {
val oldStudent = students.get(studentName).getOrElse(Student(studentName, List()))
val newStudent = oldStudent.learn(item)
oldSchool.copy(students = students + (studentName -> newStudent)) -> newStudent
}
}
}

然后我不能直接使用student.learn(info),因为Student甚至不知道环境(School类)存在。所以如果我想调用一个学生的 Action ,我必须调用环境类暴露的代理函数。如果我在 Student 中有很多操作,我必须School 中编写相同数量的代理函数,这令人沮丧且不好玩全部。

有什么建议吗?如何管理这种状态层次结构?

最佳答案

受到@WillemVanOnsem 的启发,这是我的解决方案。

  def updateStudent: String => (Student => Student) => School =
name =>
func =>
this.copy(
students = students + (name -> func(
students.get(name).getOrElse(Student(name, List()))
))
)

用法如下:

    val stu1   = Student("name1", List())
val school = School(Map(stu1.name -> stu1))

val newSchool = school.updateStudent("name1") { student =>
student.learn("someItem")
}

而且我注意到,如果你的层级非常深,(Student => Student)部分可以用Lens代替,所以你应该准备一堆Lens,而不是一堆不同深度的代理函数,酷!

关于scala - 如何在函数式编程中管理状态的层次结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56197283/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com