【发布时间】:2017-07-03 13:56:43
【问题描述】:
我有一个看起来像这样的函数:
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))
}
它定义了来自Builder => Option[Builder]的3个过滤函数(从可选参数转换而来)。我想将它们应用到现有的builder 值,所以在None 的情况下,我可以原封不动地返回自己。
上面的代码是我能想到的最好的代码,但我觉得我应该能够以某种方式使用 Monoid 来做到这一点——如果是 None,则返回 identity。
不幸的是,我不知道如何定义一个有意义的。或者,是否有更好/不同的方法?
如果这很重要,我正在使用 Cats。有什么想法吗?
【问题讨论】:
-
在无的情况下返回标识。返回幺半群的标识(零)?这意味着如果你有一个
Monoid[String].zero,你会返回一个空字符串,可以吗? -
@YuvalItzchakov 嗯,我确定我的意思是应用
identity函数来返回初始的builder... -
啊,你说的是
Monoid[Builder]? -
@YuvalItzchakov 不知道!这就是我在这里的原因,我猜:D
-
感觉不像
A => M[A]。将filters映射到内胚函数列表val fs: List[Builder => Builder] = filters.map(f => (b: Builder) => f(b).getOrElse(b))和foldK这个List似乎更自然。 (我认为foldK应该与 -Ypartial-unification 一起自动工作,但我无法使其工作,因此您可能必须手动提供类型参数。此外,猫会反向折叠列表,因为它使用compose代替andThen的MonoidK的combineK)
标签: scala functional-programming scalaz scala-cats monoids