【发布时间】:2019-12-14 04:36:35
【问题描述】:
我目前正在学习 Scala,遇到了两种处理选项的不同方法。结果是相同的,但我想知道使用其中一个是否有优势(或者是否有更好的东西)。
函数 divByTwo1 和 divByTwo2 将返回输入除以 2,如果输入也可以被 4 整除,否则返回 None。
def divByFour(i: Int): Option[Int] = {
if (i % 4 == 0) {
Some(i / 4)
} else {
None
}
}
def divByTwo1(i: Int): Option[Int] = {
for {
fourth <- divByFour(i)
} yield fourth * 2
}
def divByTwo2(i: Int): Option[Int] = {
divByFour(i) match {
case Some(fourth) => Some(fourth * 2)
case None => None
}
}
【问题讨论】:
-
第一个相当于
divByFour(i).map(fourth => fourth * 4)。第二种方式等价于map的实现。所以,基本上所有三种选择都在做“相同”。 - 现在,哪个更好是一个基于意见的问题,而不是真正的技术差异。使用map或for代替模式匹配有一个“优势”,就是代码更通用。即您可以使用任何具有相同代码的 Monad,并且语义相同,将函数应用于有效值。 -
这确实是基于意见的,您也可以使用。取决于你的风格,以及你认为什么会增加可读性。
标签: scala functional-programming pattern-matching monads optional