如何将嵌套序列转换为元组序列?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (68)

这是我上一个问题(https://stackoverflow.com/questions/50722343/how-to-improve-this-function)的后续行动。

假设我现在有一个这样的数据结构:

case class C()

case class B(cs: Seq[C])

case class A(bs: Seq[B])

你会怎么写函数A => Seq[(A, Option[B], Option[C])]

该功能应该像这样工作:

A(Nil)              // Seq((Some(A()), None, None))
A(Seq(B(Nil)))      // Seq((Some(A()), Some(B()), None))
A(Seq(B(Seq(C())))) // Seq((Some(A()), Some(B()), Some(C()))

在这种情况下,monad变压器是否有用?

提问于
用户回答回答于

我相信这能满足你的需要:

def foo(a: A): Seq[(A, Option[B], Option[C])] =
  toOptions(a.bs).flatMap(optB =>
    optB
      .map(b => toOptions(b.cs))
      .getOrElse(Seq())
      .map(optC => (a, optB, optC))
  )

// always returns a non-empty list - with None as the only value for empty input
def toOptions[T](s: Seq[T]): Seq[Option[T]] = s.headOption +: s.drop(1).map(Some(_))
用户回答回答于

你的map/flatMap组合与额外的测试为条件none

def unwind(a:A) :Seq[(A, Option[B], Option[C])] = {
  if (a.bs.isEmpty) Seq((a,None,None))
  else a.bs.flatMap{ b =>
    if (b.cs.isEmpty) Seq((a,Some(b),None))
    else b.cs.map(c => (a,Some(b),Some(c)))
  }
}

所属标签

可能回答问题的人

  • HKC

    红客学院 · 创始人 (已认证)

    26 粉丝7 提问5 回答
  • 西风

    renzha.net · 站长 (已认证)

    9 粉丝1 提问4 回答
  • Dingda

    Dingda · 站长 (已认证)

    4 粉丝0 提问3 回答
  • 螃蟹居

    1 粉丝0 提问2 回答

扫码关注云+社区

领取腾讯云代金券