如何在Scala中为表达式

时间:2016-06-23 03:52:16

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

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

使用复杂的表达式时,推断的类型通常难以遵循,或者可能偏离轨道,并且需要注释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 op。症状是编译器错误,如value filter is not a member of org.atnos.eff.Eff[E,Option[(Int, Vector[Int])]]

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

1 个答案:

答案 0 :(得分: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])]] = ???