Option monad 是如何工作的?我正在浏览 scala api还有一个例子(我的意思是第二个),
Because of how for comprehension works, if None is returned from request.getParameter, the entire expression results in None
但是当我尝试这段代码时:
val upper = for {
name <- None //request.getParameter("name")
trimmed <- Some(name.trim)
upper <- Some(trimmed.toUpperCase) if trimmed.length != 0
} yield upper
println(upper.getOrElse(""))
我收到编译错误。这应该如何工作?
最佳答案
因此,您会收到编译器错误
name <- None
这样,
None
的类型设置为 None.type
和变量 name
推断为 Nothing
类型. (也就是说,如果它确实存在,它就会有这种类型,但显然 for comprehension 甚至不会在运行时创建它。)因此没有方法 name.trim
存在,它不会编译。如果您有
request.getParameter("name")
可用,其类型为 Option[String]
, name
可能有类型 String
和 name.trim
会编译。您可以通过指定
None
的类型来解决此问题。 : name <- None: Option[String]
关于scala - Scala 中的选项 monad,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4288018/