简单的问题,我已经看过这个:Managing imports in Scalaz7,但我无法弄清楚如何将right
和left
方法最小化地注入到我的对象中来构造实例\/
。
我确实尝试过:
import syntax.ToDataOps
以及To...
的其他变体,例如http://eed3si9n.com/learning-scalaz-day13中建议的syntax.ToIdOps
。
简单示例:
import scalaz.{\/, syntax}
import // What goes here
class Test {
def returnEitherT(h: Int): String \/ Int = {
h right
}
}
谢谢,杰森。
===========
我使用import syntax.id._
解决了这个问题,但我不确定为什么会这样。
答案 0 :(得分:4)
syntax.id
包含“普通”值的语法,即它不对值的类型施加任何约束。
通常,当您导入x.op
形式的表达式的语法时,导入语法的位置取决于x
的类型,因为op
必须是有效的对那种类型的操作。
由于\/[A, B]
是针对A和B的普遍量化,因此使用x.left
和x.right
语法不会对x
的类型施加任何限制。因此,它属于syntax.id
。
为了理解可用的语法,有必要查看组成syntax
包的某些模块的来源。例如,对比IdOps[A]
,其A
的语法为FunctorOps[F[_],A]
,其F
为Functor
。
我不确定名称id
来自何处;也许它与身份仿函数Id
有关,可以定义为type Id[A] = A
。如果必须为可用于syntax.id
的值选择类型约束,则它们将位于Id
中。在A
中进行普遍量化,操作无法知道A
值的结构,因此它们不能在A
上进行结构更改操作。
答案 1 :(得分:2)
自scalaz 7以来,正确的导入是:
import scalaz.syntax.either._