У меня есть функция, которая выглядит так:
def createBuilder(builder: InitialBuilder, name: Option[String], useCache: Boolean, timeout: Option[Long]): Builder = {
val filters: List[Builder => Option[Builder]] = List(
b => name.map(b.withName),
b => if (useCache) Some(b.withCache) else None,
b => timeout.map(b.withTimeout))
filters.foldLeft(builder)((b,filter) => filter(b).getOrElse(b))
}
Он определяет 3 функции фильтра из Builder => Option[Builder]
(преобразование из необязательных параметров). Я хочу применить их к существующему значению builder
, поэтому в случае None
я могу вернуть себя без изменений.
Приведенный выше код - лучшее, что я мог придумать, но кажется, что я должен каким-то образом сделать это с моноидом - вернуть identity
в случае None.
К сожалению, я не могу понять, как определить тот, который имеет смысл. Или, если есть лучший/другой способ сделать это?
Я использую Cats, если это имеет значение. Любые идеи?
Monoid[String].zero
, вы вернете пустую строку, это нормально? - person Yuval Itzchakov   schedule 03.07.2017identity
для возврата исходногоbuilder
... - person Igal Tabachnik   schedule 03.07.2017Monoid[Builder]
? - person Yuval Itzchakov   schedule 03.07.2017A => M[A]
, который выглядит как Клейсли. Но опять же, не знаю, что здесь делать... - person Igal Tabachnik   schedule 03.07.2017A => M[A]
. Кажется более естественным сопоставить вашуfilters
со списком эндоморфных функцийval fs: List[Builder => Builder] = filters.map(f => (b: Builder) => f(b).getOrElse(b))
, а затемfoldK
этойList
. (Я думаю, чтоfoldK
должен работать автоматически с -Ypartial-unification, но я не могу заставить его работать, поэтому вам, возможно, придется указать аргументы типа вручную. Кроме того, кошки сворачивают список в обратном порядке, потому что он используетcompose
вместоandThen
дляcombineK
9_. ) - person Kolmar   schedule 03.07.2017