Scala 阅读器monad的应用实例

Scala 阅读器monad的应用实例,scala,monads,scalaz,applicative,Scala,Monads,Scalaz,Applicative,我认为scalaz中的每个monad都有一个Applicative实例。例如,我可以对选项使用ApplicationBuilder,如下所示: scala> (1.some |@| 2.some) {_ + _} res1: Option[Int] = Some(3) 现在我想对阅读器做同样的操作: scala> type IntReader[A] = Reader[Int, A] defined type alias IntReader scala> val r1: In

我认为
scalaz
中的每个monad都有一个
Applicative
实例。例如,我可以对
选项使用
ApplicationBuilder
,如下所示:

scala> (1.some |@| 2.some) {_ + _}
res1: Option[Int] = Some(3)
现在我想对
阅读器做同样的操作:

scala> type IntReader[A] = Reader[Int, A]
defined type alias IntReader

scala> val r1: IntReader[Int] = Reader {x: Int => x + 1 }
r1: IntReader[Int] = Reader(<function1>)

scala> val r2: IntReader[Int] = Reader {x: Int => x + 2 }
r2: IntReader[Int] = Reader(<function1>)

scala> (r1 |@| r2) {_ + _}
<console>:64: error: value |@| is not a member of IntReader[Int]
          (r1 |@| r2) {_ + _}
scala>type IntReader[A]=Reader[Int,A]
定义的类型别名IntReader
scala>val r1:IntReader[Int]=Reader{x:Int=>x+1}
r1:IntReader[Int]=Reader()
scala>val r2:IntReader[Int]=Reader{x:Int=>x+2}
r2:IntReader[Int]=读取器()
scala>(r1 |@| r2){uu+}
:64:错误:值|@|不是IntReader[Int]的成员
(r1 |@| r2){uuu+}

上面的代码为什么不编译?

为了完整起见:
Applicative
实例不需要导入即可使用:

scala> type IntReader[A] = scalaz.Reader[Int, A]
defined type alias IntReader

scala> scalaz.Applicative[IntReader]
res0: scalaz.Applicative[IntReader] = scalaz.KleisliInstances3$$anon$3@f979171
但是,如果要使用
@
语法,则需要导入
scalaz.syntax.apply.

scala> import scalaz.syntax.apply._
import scalaz.syntax.apply._

scala> val r1: IntReader[Int] = scalaz.Reader((x: Int) => x + 1)
r1: IntReader[Int] = Kleisli(<function1>)

scala> val r2: IntReader[Int] = scalaz.Reader((x: Int) => x + 2)
r2: IntReader[Int] = Kleisli(<function1>)

scala> (r1 |@| r2) { _ + _ }
res1: IntReader[Int] = Kleisli(<function1>)
scala>导入scalaz.syntax.apply_
导入scalaz.syntax.apply_
scala>val r1:IntReader[Int]=scalaz.Reader((x:Int)=>x+1)
r1:IntReader[Int]=Kleisli()
scala>val r2:IntReader[Int]=scalaz.Reader((x:Int)=>x+2)
r2:IntReader[Int]=Kleisli()
scala>(r1 |@| r2){uu+}
res1:IntReader[Int]=Kleisli()

这是因为
@
不是
阅读器上的一个方法-它是由
ApplyOps
扩展类提供的。

你确定你已经导入了
scalaz.syntax.apply.\u
?哦,不,我会尝试的,谢谢你。@TravisBrown是的,它正在进行导入!非常感谢汉克斯的解释。