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
,not
run
。当我传递initObj时,我得到的是
initObj
状态,而不是
finalObj
。你能在第48行看到我的消息来源吗在这里,我试图使用您在代码中定义的状态monad修改您的源代码。特别是,看看
go
是如何工作的。注意:这是一个非常粗略的准备过程,只是想传达一个大概的想法。@Shadowlands,你能告诉我你为什么要校准
go(xs)(m)
,以及你为什么要更改
go
的函数签名吗?请注意,我不完全理解单子。调用
go(inputs)
返回一个
状态[Machine,(Int,Int)]
,这是从(初始)
Machine
到(最终)
(Machine,(Int,Int))
对的函数。因此,它不接受
机器本身。开始的
机器
被传递到这个生成的函数中。