从嵌套选项中提取值 [英] Extract Value from nested options

查看:52
本文介绍了从嵌套选项中提取值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

What is the most concise way to get 10 out of Some(Some(Some(Some(10))))?

无需借助像 Scalaz 这样的外部库.

without resorting to some external library like 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)

这篇关于从嵌套选项中提取值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆