2013-10-14 102 views
0

比方说,我有一个类型:访问匿名函数

type State[S, +A] = S => (A,S) 

和功能:

def foo(): State[Obj, (x, y)] 

如果我调用这个函数:

val result = foo() // result is an anonymous function: Obj => ((x, y), Obj)

哪有我访问Obj(x, y)值?

回答

0

为了获得(x, y)的具体值和Obj的最终状态,您需要将初始值Obj传递到您的函数中。类似:

val (coords, finalObj) = foo().run(initObj) 

(I可以记错在scalaz状态单子的run方法的名称)。

UPDATE

其实,我觉得这只是apply,所以foo()(initObj)会工作(虽然我可能会获得对foo定义摆脱不必要的括号,降低了最终调用只是foo(initObj)) 。

+1

因为'State'被定义为一个函数,所以你可以调用'apply',而不是'run'。 –

+0

当我传递一个initObj时,我得到'initObj'状态,而不是'finalObj'。你可以在第48行看到我的消息来源吗? - https://github.com/kman007us/side-work/blob/master/CandyMachine/CandyMachine.scala –

+0

[这是一个要点](https://gist.github.com/anonymous/6987251)我曾尝试过修改您的源代码以使用您在代码中定义的State monad来工作。尤其要看看'go'的运作方式。注:这是非常粗糙和准备就绪,只是想传达一般想法。 – Shadowlands