【发布时间】:2013-06-24 05:03:52
【问题描述】:
在Functional Programming in Scala 书中有一个问题要求将选项列表转换为列表选项。函数签名如下:
def sequence[A](a:List[Option[A]]):Option[List[A]]
在书的网站上,这个功能是这样实现的:
def sequence[A](a:List[Option[A]]):Option[List[A]] = a match {
case Nil => Some(Nil)
case h::t => h flatMap (r => sequence(t) map (h::_))
}
我对@987654324@ 部分感到有些困惑。如果我把它分解,它是这样的:
h 的类型为 Option[A]。在 h 上执行 flatMap 将返回一个 Option[B],但它以一个函数 f 作为参数,该函数以 A 作为参数并返回一个 Option[B],现在在上面的示例中,sequence(t) map (h :: _) 将返回一个 Option[List[A]],它与函数的返回类型。
可以使用 map 代替 flatMap 来执行从 List[Option[A]] 到 Option[List[A]] 的转换吗?此外,提供的解决方案似乎不是尾递归的。可以做尾递归吗?
【问题讨论】:
标签: list scala map higher-order-functions