scala - 从嵌套选项中提取值

标签 scala

Some(Some(Some(Some(Some(10)))) 中得到 10 的最简洁方法是什么?

无需求助于 Scalaz 等外部库。

最佳答案

import scala.language.higherKinds     

case class Flattener[W[_], WW, T](fn : WW => W[T])

implicit def optionRecFlattenFn[WW, T](
  implicit f : Flattener[Option, WW, T] = Flattener((ww: WW) => Option(ww))
) = Flattener((ww : Option[WW]) => ww.flatMap(f.fn))

def optionRecursiveFlatten[WW, T](www : Option[WW])(
  implicit f : Flattener[Option, Option[WW], T]
) = f.fn(www)

val nestedOption = Option(Option(Option(Option(10))))
// Some(Some(Some(Some(10))))

val flatOption = optionRecursiveFlatten(nestedOption)
// Some(10)

val evenMoreNestedOption = Option(Option(Option(Option(Option(Option(10))))))
// Some(Some(Some(Some(Some(Some(10))))))

val flatOption2 = optionRecursiveFlatten(evenMoreNestedOption)
// Some(10)

关于scala - 从嵌套选项中提取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39601083/

相关文章:

scala - scala 中的问题 `object Foo { val 1 = 2 }`

scala - 如何在 Scala 中为表达式注释表达式类型

Scala:类型不匹配 MapFunction[Tuple2[Text, Text], NotInferedR]

scala - 为什么 Scala 编译器会失败并返回 "object SparkConf in package spark cannot be accessed in package org.apache.spark"?

scala - Spark 中 Stage 的详细信息

json - 如何从 Scala 中的 jsonp 字符串中提取 json

scala - Proguard 不会删除某些类

sql - ScalaQuery 多对多

scala - Akka流通过限流并行/处理流的吞吐量

scala - Spark 应用程序出现 "Task not serializable"错误?