Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala for comprehension with Option and Some,由ReaderT包装_Scala_Typeclass_Scala Cats_For Comprehension_Subtyping - Fatal编程技术网

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