【问题标题】:How to annotate types of expressions within a Scala for expression如何在 Scala 中为表达式注释表达式类型
【发布时间】:2016-10-25 05:19:16
【问题描述】:

我想知道如何(安全地)在 Scala 的左侧为表达式添加类型归属。

在使用复杂的 for 表达式时,推断的类型通常难以遵循,或者可能会偏离轨道,因此最好在 for {..} 块中注释表达式,以检查您和编译器是否一致。使用Eff monad的说明性代码草图:

for {
  e1: Option[(Int, Vector[Int])] <- complexCalc
  e2 <- process(e1)
} yield e2

def complexCalc[E]: Eff[E, Option[(Int, Vector[Int])]] = ???

但是,这与 Scala 对 for 表达式的 LHS 上的模式匹配的支持相冲突。

最终结果是,添加类型归属会使 LHS 模式看起来可反驳,并且需要在 RHS 上定义 filter 操作。症状是编译器错误,例如 value filter is not a member of org.atnos.eff.Eff[E,Option[(Int, Vector[Int])]]

如果有任何句法形式可用于将类型归属于包含元组的中间表达式,在 for 表达式中,而不会遇到可反驳的模式匹配?

【问题讨论】:

  • 您能举一个例子(complexCalc 和 process)来证明这一点吗?您链接到的上一个问题没有讨论该位置的类型注释。你是通过Anys 吗?
  • 你不能归属于右手边吗? for { e &lt;- (complexCalc : Eff[E, Option[(Int, Vector[Int])]]) ; ... } yield e2 之类的东西?
  • @PeterNeyens 是的。 RHS 类型更复杂,因为它们包含 monadic 包装器(例如上面的Eff[E, &lt;lhs&gt;]),因此希望找到一种方法来注释更简单的 LHS “有效负载”类型

标签: scala filter pattern-matching monads type-inference


【解决方案1】:

原来在这个Scalaz PR * 中对这个问题进行了广泛的讨论,以及当前的最佳解决方案。

解决方法是在下一行的赋值中添加类型归属:

for {
  e <- complexCalc
  e1: Option[(Int, Vector[Int])] = e
  e2 <- process(e1)
} yield e2

def complexCalc[E]: Eff[E, Option[(Int, Vector[Int])]] = ???

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 2014-07-26
    • 2021-03-04
    • 2010-09-18
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多