当前位置: 首页 > 知识库问答 >
问题:

如何从效果上的函子到函子上的效果?

高修筠
2023-03-14

我有两种不同类型的用户;让我们称它们为BasicUserEnrichedUser

我得到了容器C中的Foouser type的值,该容器具有cats。函子实例:

val basicUserF: C[BasicUser] = getBasicUser(…)

现在我想映射这个值(使用functorhtml" target="_blank">实例),将包含的< code>BasicUser转换为< code>EnrichedUser用户,保留在容器中:

import cats.syntax.all._

val enrichedUserF: C[EnrichedUser] = basicUserF.map(user => enrichUser(user))

然而,< code>enrichUser并不返回< code > enrich user ,而是返回< code>OptionT[Future,enrich user],因此我最后使用了以下类型:

val enrichedUserThing: C[OptionT[Future, EnrichedUser]] = …

我如何从这个类型获得< code>OptionT[Future,C[EnrichedUser]](我最终将把它转换成一个JSON序列化的Akka HTTP响应)?

共有1个答案

贺奕
2023-03-14

如果您有一个< code>Traverse[C]实例,您可以使用< code>sequence。

scala> implicit def CTraverse: Traverse[C] = ???
CTraverse: cats.Traverse[C]

scala> def sequenced = enrichedUserThing.sequence[OptionT[Future,?], EnrichedUser]
sequenced: cats.data.OptionT[scala.concurrent.Future,C[EnrichedUser]]

额外:如果启用了 -Ypartial-Unification,则不需要显式类型参数。

 类似资料:
  • 错误警告:React 检测到身份验证页面调用的钩子顺序发生了变化。如果不修复,这将导致错误和错误。有关更多信息,请阅读钩子规则:https://reactjs.org/link/rules-of-hooks 代码: 为什么订单发生变化,我如何纠正这种行为?

  • Appbar过去在投掷时有一个问题。它滚动不流畅。 请参阅以下文件: http://stackoverflow.com/questions/30923889/flinging-with-recyclerview-appbarlayout https://code.google.com/p/android/issues/detail?id=177729 但它已在支持库版本26中修复。 然而,appb

  • 问题内容: 我有这个查询: 但是我想做这样的事情: 如何检查电子邮件是否存在?我要使用电子邮件,如果此字段为空,我要使用email2。我该如何完成? 问题答案: 用于选择字段,然后在其后放置该子句:

  • 在基于类的组件中: 我试过这个: 它创建了一个无限循环。如果我传递一个[]/{}作为第二个参数[1][2],那么它将阻止进一步的调用。但它也会阻止数组更新。 [1] 无限循环效应 [2] 如何只调用一次带有React useEffect的加载函数

  • 因此,我在理解传递给子组件的prop的函数调用方式的差异时遇到了一个问题。 v、 美国。 第一个按预期工作,并在单击时给我组件状态的id。第二个在加载时打印每个组件的所有id,甚至在我有机会点击它们之前。我错过了什么?为什么返回语句如此重要?谢谢你的帮助。

  • 我用这篇文章作为例子(React way),但它对我不起作用。请指出我的错误,因为我不明白出了什么问题。 这就是我看到的错误: 错误:this.props.on点击不是一个函数 这是我的密码: 提前谢谢!