scala - Scala 中的选项 monad

标签 scala monads scala-option

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可能有类型 Stringname.trim会编译。

您可以通过指定 None 的类型来解决此问题。 :
  name <- None: Option[String]

关于scala - Scala 中的选项 monad,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4288018/

相关文章:

scala - 可以/应该在 Scala 中添加/创建从 T 到 Option[T] 的隐式转换吗?

可以扩展自身的 Scala 集合类?摘要序列困惑

scala - 不同类型任务的功能组合 - Scala

scala - free monad 应该基于的仿函数在哪里

haskell - 在什么情况下单子(monad)计算是尾递归的?

Scala 选项映射到另一个选项

scala - 使用 Spark 中的数据框以微秒精度解析日期

scala - 自动检查依赖项是否是最新的

functional-programming - 状态单子(monad)的目的是什么?

scala - Scala 的 Option 以何种方式折叠 catamorphism?