一个带有 flatMap/map 的简单类,它什么都不做,只是懒惰地存储一个值:
[注 1:这个类可以替换为任何带有 flatMap/map 的类。选项只是一个具体的例子,这个问题是关于一般情况的]
[注2:scalaz 是一个有趣的库,但这个问题与它无关。如果除了我在下面发布的内容之外没有 std scala 库解决方案,那是可以接受的。]
class C[A](value : => A) {
def flatMap[B](f: A => C[B]) : C[B] = { f(value) }
def map[B](f: A => B) : C[B] = { new C(f(value)) }
override def toString = s"C($value)"
}
object C {
def apply[A](value : => A) = new C[A](value)
}
一个迭代地将 flatMap 应用于其成员的函数:
def invert[A](xs: Traversable[C[A]], acc: List[A] = Nil) : C[List[A]] =
if(xs.nonEmpty) {
xs.head flatMap { a => invert(xs.tail, a :: acc) }
} else {
C(acc.reverse)
}
实际作用:
scala> val l = List(C(1),C(2),C(3))
l: List[C[Int]] = List(C(1), C(2), C(3))
scala> invert(l)
res4: C[List[Int]] = C(List(1, 2, 3))
有没有办法习惯性地重写“反转”?此外,是否有一个功能性“动词”可以捕捉我在这里所做的事情?