2013-11-28 1 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, государственная монада - это один из способов немного почистить вещи.

+0

У меня ошибка компиляции при запуске: найдено: (S, Unit) required: S –

+1

Вы указали тип возврата для 'process'? Если это так, вы можете использовать 'writeAll (as) .exec (init)', чтобы получить только конечное значение состояния. –

Смежные вопросы