我想知道如何(安全地)将类型归属添加到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上的模式匹配的支持相冲突。
: Option[(Int, Vector[Int])]
视为要匹配的模式。withFilter
method to handle the non-matching case。最终结果是添加类型归属使LHS模式看起来可以反驳,并且需要在RHS上定义filter
op。症状是编译器错误,如value filter is not a member of org.atnos.eff.Eff[E,Option[(Int, Vector[Int])]]
。
如果有任何语法形式可用于将类型归类到包含元组的中间表达式,在表达式中,不会遇到可反复模式匹配?
答案 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])]] = ???