Scala for comprehension with Option and Some,由ReaderT包装
下面是一个很好的例子:Scala for comprehension with Option and Some,由ReaderT包装,scala,typeclass,scala-cats,for-comprehension,subtyping,Scala,Typeclass,Scala Cats,For Comprehension,Subtyping,下面是一个很好的例子: import cats.data.ReaderT import cats.instances.option._ ... def f1:ReaderT[Option, Service, Int] = ReaderT(service => for { res <- Some(10) } yield res ) 你能解释一下吗?为什么在第一个示例中,返回一些,而不是选项,效果很好。为什么在第二个示例中,返回的Some没有
import cats.data.ReaderT
import cats.instances.option._
...
def f1:ReaderT[Option, Service, Int] =
ReaderT(service => for {
res <- Some(10)
} yield res )
你能解释一下吗?为什么在第一个示例中,返回一些
,而不是选项
,效果很好。为什么在第二个示例中,返回的Some
没有被编译?Scala编译器是否有编译案例的选项,如第二个示例?或其他解决方案 试试看
import cats.syntax.option._
def f2: ReaderT[Option, Service, Int] =
for {
res <- ReaderT((_: Service) => 10.some)
} yield res
import cats.syntax.option_
def f2:ReaderT[选项,服务,内部]=
为了{
第10条(部分)
}收益率
最好使用x.some
和none
(或none[x]
)而不是some(x)
和none
。它们有类型选项[X]
,而不是一些[X]
和无。类型
。这有时可以改进类型推断。实际上是选项
是函子
的一个实例,而不是某些
请参阅中的“扩展方法构造函数”
在第一种情况下,您很幸运,正确地推断了类型
Some
上调用map
,已知该函数返回选项
(带有选项
的子类Some
)的普通多态性),然后它继续查找函子[Option]
Some[Int]
,编译器试图找到Functor[Some]
typeclass的实例,以便调用Reader
上的方法(带有typeclass的特殊多态性Functor
),但失败,因为有些没有函子Some
不仅仅是Option
类型的实例的构造函数(例如,在Haskell中就是这样),它实际上是Some
类型的实例(大部分是无用的)的构造函数,这有时会搞砸类型推断/隐式解析
如果要强制执行生成的类型为
选项[Int]
,请使用选项(10)
来构造部分
或选项。空
来构造无
部分(10)
属于部分[Int]
类型,而不是选项[Int]
。这不是因为运气,而是因为该方法返回选项[B]
。好吧,幸运的是“map方法返回选项[B]:)是的,不可否认,它取决于理解和读取器
-构造函数调用顺序中最细微的变化,因此,在大多数实际应用中,它几乎就像只有在幸运的时候才推断出正确的类型:]我的观点是,它仍然是一种确定性的,并且可以从API中解释。套用爱因斯坦的话,“编译器不玩骰子。”:感谢如此详细的解释!我接受了你更详细的回答。@Alexandr我更关注于解释错误发生的原因,而另一个答案更关注于解释如何避免错误<代码>10。有些也不错。
def f2:ReaderT[Option, Service, Int] =
for {
res <- ReaderT((_:Service) => Option(10))
} yield res
import cats.syntax.option._
def f2: ReaderT[Option, Service, Int] =
for {
res <- ReaderT((_: Service) => 10.some)
} yield res