在scala中使用forall()从Option [String]中提取字符串[重复]
Posted
技术标签:
【中文标题】在scala中使用forall()从Option [String]中提取字符串[重复]【英文标题】:Using forall() in extracting String from Option[String] in scala [duplicate] 【发布时间】:2020-07-17 02:06:57 【问题描述】:我不明白 forAll 何时处理 None 值。
def areTheyEqual(x: Option[String], y: String) =
if (x.forall(_ == y))
true
else
false
当我调用函数时:
areTheyEqual(None, "hello")
这返回 true,当我期望这是 false 因为它们不相等时。请帮忙。为什么会这样?
编辑:
为了解决这个问题,我将 if 语句更改为:
if (x.nonEmpty && x.forall(_ == y))
但我仍然想知道为什么它在没有x.nonEmpty
条件的情况下返回true。
【问题讨论】:
如果您将 Some 视为具有单个元素的列表,而将 None 视为具有 0 个元素的列表(它们不是),这可能会有所帮助 BTWif (foo) true else false
是多余的,你可以直接返回 foo
。
这就是forall
def 看起来像final def forall(p: A => Boolean): Boolean = isEmpty || p(this.get)
。因此,如果它是空的并且这意味着 None 无论如何,它将返回 true,否则将测试谓词。从文档 ` /** 如果此选项为空,则返回 true '''或'''谓词` * $p returns true when applied to this $option's value.
*
* This is equivalent to:
` * option match ` ` * case Some(x) => p( x)`* case None => true
`*`*/
【参考方案1】:
一般来说,forall
方法检查集合中的所有对象是否满足某个谓词。那么返回false
是什么意思呢?从逻辑上讲,它必须意味着集合中存在谓词不正确的元素。那么None
是否包含谓词不正确的元素?显然不是,因为它根本不包含任何元素。因此,在这种情况下,forall
返回false
是错误的。所以这一切都说得通。
另一方面,如果Option
为空,则exists
方法将返回false
。
【讨论】:
以上是关于在scala中使用forall()从Option [String]中提取字符串[重复]的主要内容,如果未能解决你的问题,请参考以下文章
翻译/编码 Haskell 的 `data Obj = forall a. (显示 a)=> Scala 中的 Obj a`