【发布时间】:2014-04-13 08:48:29
【问题描述】:
假设我有两个函数来获取订单和订购商品:
def getOrders(): Option[List[Int]] = ... def getOrderItems(orderId: Int): Option[List[Int]] = ...请注意,这两个函数都返回Option[List],因为每个函数都可能失败。
现在我想得到Option of List 的所有订单项目如下:
- 如果两个函数都返回
Some和 ,则返回 -
None如果其中任何一个返回无。
Some[List]
我尝试用for(见下文)组合这些函数,但没有成功。
如何使用函数getOrders 和getOrderItems 构建函数getAllOrderItems():Option[List[Int]]?
【问题讨论】:
-
“它不起作用”是什么意思?您是否收到错误或与预期不同的结果?您的预期是什么?这与实际情况有何不同?
-
Option 和 List monad 不兼容。您需要使用 monad 转换器,或在 Options 上调用 toList (或使用适当类型的 breakOut 也可以工作)。
-
@GáborBakos 谢谢。
monad transformer看起来像是一个高级主题。此外,我需要scalaz。您如何建议使用breakOut来做到这一点? -
@Michael 在这种情况下,可能只会在 getOrder() 之后调用 toList,例如 getOrder().toList。我不确定 breakOut 是否可以在这里使用,但它是为类似的用例设计的。 (虽然在这种情况下 toList 似乎更容易。)
-
@GáborBakos 谢谢。
toList看起来很简单。