作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个问题与this one有关,我试图了解如何在 Scala 中使用 reader monad。
在答案中,作者使用以下代码获取 ReaderInt[String]
的实例:
import scalaz.syntax.applicative._
val alwaysHello2: ReaderInt[String] = "hello".point[ReaderInt]
"hello".point[ReaderInt]
以便它使用正确的
point
功能?
最佳答案
任何时候你想弄清楚这样的事情的一个很好的第一步是使用反射 API 来对表达式进行脱糖:
scala> import scalaz.Reader, scalaz.syntax.applicative._
import scalaz.Reader
import scalaz.syntax.applicative._
scala> import scala.reflect.runtime.universe.{ reify, showCode }
import scala.reflect.runtime.universe.{reify, showCode}
scala> type ReaderInt[A] = Reader[Int, A]
defined type alias ReaderInt
scala> showCode(reify("hello".point[ReaderInt]).tree)
res0: String = `package`.applicative.ApplicativeIdV("hello").point[$read.ReaderInt](Kleisli.kleisliIdMonadReader)
scala.reflect.runtime
,但它对于此类调查非常方便。)
.point[ReaderInt]
时在没有
point
的类型上方法—在本例中
String
— 它开始寻找可以转换
String
的隐式转换转换为确实具有匹配的类型
point
方法(这在 Scala 中称为“浓缩”)。我们可以从
showCode
的输出中看到它找到的隐式转换是一个名为
ApplicativeIdV
的方法在
applicative
语法对象。
String
,产生类型
ApplicativeIdV[String]
的值.这种类型的
point
方法如下所示:
def point[F[_] : Applicative]: F[A] = Applicative[F].point(self)
def point[F[_]](implicit F: Applicative[F]): F[A] = F.point(self)
Applicative
F
的实例.在您的情况下,您已明确指定
F
是
ReaderInt
.它将别名解析为
Reader[Int, _]
,它本身就是
Kleisli[Id.Id, Int, _]
的别名,并开始寻找实例。
Kleisli
伴随对象,因为它需要包含
Kleisli
的类型的隐式值。 ,事实上
showCode
告诉我们它找到的那个是
Kleisli.kleisliIdMonadReader
.到那时它就完成了,我们得到了
ReaderInt[String]
我们要。
关于Scalaz: `scalaz.syntax.applicative._` 如何发挥它的魔力,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38622081/
在 Play 1.x 中有很棒的 play Idealize(和 play eclipsify),它为您最喜欢的 IDE 中的 Play 项目准备了项目文件。 我看到这是在 Play 2.X 中删除的
我是一名优秀的程序员,十分优秀!