【发布时间】:2017-11-19 17:57:56
【问题描述】:
我有以下特点:
import scalaz.Monoid
trait Mapper[M, R] {
def map(m: M): R
}
object Mapper {
@inline implicit def listMapper[M, R]
(implicit mapper: Mapper[M, R], s: Monoid[R]): Mapper[List[M], R] =
(xs: List[M]) => xs. foldLeft(s.zero)((r, m) => s.append(r, mapper.map(m)))
}
现在我想用R = String 列出映射器,它会产生类似下面的[mapped_string1, mapped_string2] 或
$%%""mapped_string1, mapped_string2""%%$.
问题是以下 monoid 实现将不起作用:
implicit val myStringMonoid: Monoid[String] = new Monoid[String] {
override def zero = ""
override def append(f1: String, f2: => String) =
if (f1.isEmpty) f2
else if(f2.isEmpty) f1
else f1 + ", " + f2
}
所以下面一行
println(implicitly[Mapper[List[String], String]].map(List("mapped_string1", "mapped_string2")))
打印mapped_string1, mapped_string2 不带尖括号。
这种情况有什么解决方案?也许只有幺半群确实很适合我的需要。也许我需要另一个抽象层次。
我的意思是如何在foldLeft 完成后添加一些要调用的附加操作?不耦合到 String 或任何特定类型。
【问题讨论】: