2013-10-14 100 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