【发布时间】:2018-08-26 05:32:42
【问题描述】:
我现在正在阅读红书“Scala 中的函数式编程”,因此我同时也在学习 Scala。如果我理解正确,特质并不意味着对象。如果我在这里错了,请纠正我。
我的问题是我不知道如何在将 A 类型的列表包装在 Some 特征中时构造它。我希望能得到正确方向的提示。
在我正在进行的练习中,我被要求定义一个函数,该函数旨在转换列表中的每个元素,然后将整个列表包含在 Some 特征中。
这是我的代码:
def traverse[A, B](a: List[A])(f: A => Option[B]): Option[List[B]] = a match {
case Nil => Nil: B
case h :: t => f(h) flatMap ( hh => hh :: traverse(t)(f))
}
我觉得我在正确的轨道上,但 scala 解释器抱怨 :: 不适用于 Option[List[B]]。我认为这是因为函数的类型签名不返回一个列表,它返回一个包装在 Some 中的 List。
但是我对 flatMap 的直觉会不会也是错误的? f(h) 返回一个 Option[B]。调用 flatmap 实际上是在 Option 内部,所以 hh 的类型是 B 对吗?我的逻辑是这样我可以用函数hh :: traverse(t)(f) 构造一个B 类型的列表。但我不完全确定是否就在这里。
如果有什么不同,我将使用带有 :paste 命令的 scala 解释器。我不确定这是否会让事情变得更加糟糕。
【问题讨论】:
-
traverse返回您,例如Some(list),您想将您的hh添加到该列表,而不是Some。您通常使用map:Some(list).map(hh::_)执行此操作,这将返回您Some(hh::list)。 -
为什么我没有想到!...我至少很接近。
标签: scala error-handling functional-programming