2013-11-28 46 views
1

寫入方法我有這個非常頻繁類型的代碼:如何實現返回的狀態

def writeOne(s: S, a: A) : S = … 
def writeAll(init: S, l: List[A]) = l.foldLeft(init)(writeOne) 
def process = { 
    val as : List[A] = … 
    val init : S = new S() 
    writeAll(init, as) 
} 

有沒有更好的辦法,在代碼設計來看,寫的是什麼?

+0

更好的是什麼條件?可讀性?性能? – LuGo

+0

@LuGo我編輯了這個問題。 –

回答

1

是否願意使用Scalaz?國家單子可以幫你封裝了一些通過這些操作線程狀態的業務:

import scalaz._, Scalaz._ 

def writeOne(a: A): State[S, Unit] = State.modify(
    s => ??? // Do something with `s` and `a`, returning the new `S`. 
) 

def writeAll(l: List[A]): State[S, Unit] = l.traverseS_(writeOne) 

def process = { 
    val as: List[A] = ??? 
    val init = new S() 

    writeAll(as).run(init) 
} 

我不找你的代碼特別冗長或難以閱讀,但如果你覺得你寫太多的方法需要一些參數s: S並返回一個新的S,狀態monad是一種清理事情的方法。

+0

我在運行時遇到編譯錯誤:找到:(S,Unit)required:S –

+1

您是否指定了'process'的返回類型?如果是這樣,你可以使用'writeAll(as).exec(init)'來獲得最終的狀態值。 –