【发布时间】:2020-07-11 13:09:48
【问题描述】:
状态单子看起来像我从 Philip Wadler 的函数式编程单子中借用的理论:
type M a = State → (a, State)
type State = Int
unit :: a → M a
unit a = λx. (a, x)
(*) :: M a → (a → M b) → M b
m * k = λx.
let (a, y) = m x in
let (b, z) = k a y in
(b, z)
我想使用状态单子的方式如下:
给定一个列表 L,我希望我的代码的不同部分获取此列表并通过在其末尾添加新元素来更新此列表。
我猜上面会修改为:
type M = State → (List[Data], State)
type State = List[Data]
def unit(a: List[Data]) = (x: State) => (a,x)
def star(m: M, k: List[Data] => M): M = {
(x: M) =>
val (a,y) = m(x)
val (b,z) = k(a)(y)
(b,z)
}
def get = ???
def update = ???
我如何填写详细信息,即?
- 如何实例化我的层次结构以处理具体列表?
- 如何实现上述的get和update?
最后,我将如何使用 Scala 的语法和 flatMap 和单元来做到这一点?
【问题讨论】:
-
如果您将 State 设为一个类并在其中定义
flatMap,这可能会更容易实现。您可以在伴随对象中定义unit。 - 不管怎样,get很简单,你会收到一个 M 并返回它的 State。update将是,您会收到一个 M 和一个新的 State,然后创建一个新的 M。 -
@LuisMiguelMejíaSuárez 感谢您的评论。 “接收M”到底是什么意思。如果它的 M 是上面的 M 类型,我不知道它的状态是什么,因为它会是一个函数。你的意思是一对 x 状态?
-
这个链接很好地解释了状态单子在haskell mmhaskell.com/monads/state的实践中的使用@