我想为Option
实现一个类似于functor的东西,它可以累积成功的结果。
它的行为应该像这样(类似于下面的scala代码):
Some(1).map(_ + 1) # => Some[(Int, Int)] = Some((1,2))
Some(1).map(_ + 1).map(_ * 3) # => Some[(Int, Int, Int)] = Some((1,2,6))
Some(1).map(_ => None) # Option[None.type] = Some(None)
字符串
我知道这不是一个合适的函子,因为它不保持同一性:Some(42).map(identity) # => Some[(Int, Int]) = Some((42, 42))
个
为了添加一些上下文,我认为当有一个Map链时会很有用:
val result = Some(42).map(compute_second_value).map(compute_third_value)
型
以及模式匹配结果,其不仅取决于result
最终值:
result match {
case Some(value) => do_something_with_all_results(result._1, result._2, result._3)
case None => ...
}
型
因此,我正在寻找一个众所周知的解决方案/方法/理论术语,与期望的行为有关
1条答案
按热度按时间deyfvvtc1#
你可以用Scala中的
foldLeft
以一种“通用”的方式实现它,并处理一个序列而不是一个元组:字符串
或者用一种不太通用的方法来保持元组:
型
Option
,我都没有管理flatMap
情况,但这可以相对容易地由读者实现。