Scala 访问匿名函数
假设我有一种类型:Scala 访问匿名函数,scala,Scala,假设我有一种类型: type State[S, +A] = S => (A,S) 和一个函数: def foo(): State[Obj, (x, y)] 如果我调用此函数: def foo(): State[Obj, (x, y)] val result=foo()//结果是一个匿名函数:Obj=>((x,y),Obj) 如何访问Obj和(x,y)值?为了获得(x,y)的具体值和Obj的最终状态,需要将Obj的初始值传递到函数中。比如: val (coords, finalObj)
type State[S, +A] = S => (A,S)
和一个函数:
def foo(): State[Obj, (x, y)]
如果我调用此函数:
def foo(): State[Obj, (x, y)]
val result=foo()//结果是一个匿名函数:Obj=>((x,y),Obj)
如何访问
Obj
和(x,y)
值?为了获得(x,y)
的具体值和Obj
的最终状态,需要将Obj
的初始值传递到函数中。比如:
val (coords, finalObj) = foo().run(initObj)
(我可能记错了scalaz state monad上的run
方法的名称)
更新
实际上,我认为它只是
apply
,所以foo()(initObj)
会起作用(尽管我可能会去掉foo
定义中不必要的括号,将最后的调用减少到foo(initObj)
。因为State
是上面定义的一个函数,所以您可以调用apply
,notrun
。当我传递initObj时,我得到的是initObj
状态,而不是finalObj
。你能在第48行看到我的消息来源吗在这里,我试图使用您在代码中定义的状态monad修改您的源代码。特别是,看看go
是如何工作的。注意:这是一个非常粗略的准备过程,只是想传达一个大概的想法。@Shadowlands,你能告诉我你为什么要校准go(xs)(m)
,以及你为什么要更改go
的函数签名吗?请注意,我不完全理解单子。调用go(inputs)
返回一个状态[Machine,(Int,Int)]
,这是从(初始)Machine
到(最终)(Machine,(Int,Int))
对的函数。因此,它不接受机器本身。开始的机器
被传递到这个生成的函数中。