我有一个玩! 2 for Scala应用程序需要从外部服务中检索JSON格式的一些数据。Monad变换器是否适用于从服务获取JSON?
玩!框架允许通过将响应包装在Promise中来异步发出HTTP请求。 Promise
是一个monad,它包含将来可用的值。
这很好,但在我的情况下,我从Web服务得到的是一个JSON字符串。我必须解析它,解析可能会失败。所以我必须把我得到的任何东西都包装进Option
。结果是我的很多方法都返回Promise[Option[Whatever]]
。也就是说,类型Whatever
的值可能稍后可用。
现在每当我必须操作这样一个值,我需要map
它两次。我想在下面的方式处理这个:
- 创建一个新的类型,说
Hope[A]
,一个包装了Promise[Option[A]]
- 界定相关方法,如
map
(或者也许我应该使用foreach
和继承一些集合特性?)和flatten
- 提供
Promise[Option[A]]
和Hope[A]
之间的隐式转换器。
很容易界定map
- 两个函子的成分又是一个函子 - 和flatten
可以明确地在这种情况下进行,或每当组成一个单子有Option
。
但是这是我有限的理解,我不需要重新发明这个东西:monad变压器正好存在这种情况。或者说,好了,所以我想 - 我从来没有使用一个单子变压 - 这就是问题的要点:
能单子发电产品在这种情况下使用?我将如何去实际使用它们?
谢谢,看来这正是我所需要的! – Andrea
我已经尝试过了,在我的应用程序中一切正常。只有一件奇怪的事情:如果我引入一个类型别名'类型Hope [A] = Promise [Option [A]]'来简化函数的返回类型,我会得到一个编译时错误java.lang.IllegalArgumentException :转置要求所有集合具有相同的大小。你有什么线索为什么? – Andrea
@Andrea:如果使用'optionT'显式类型参数,则错误应该消失。它看起来像一个编译器错误,如果您有时间可能值得检查[问题跟踪器](https://issues.scala-lang.org/secure/Dashboard.jspa)或在此处询问后续问题。 –