2016-11-30 88 views
0

我想从“斯卡拉函数编程”这本书中运行代码,它似乎是针对旧版本的scala(从here下载)。 tmp.scala:斯卡拉子类模式匹配

sealed trait Option[+A] 
case class Some[+A](get: A) extends Option[A] 
case object None extends Option[Nothing] 

trait Option[+A] { 
    /* returns None if None, or function applied to the some object */ 
    def map[B](f: A => B): Option[B] = this match { 
     case None => None 
     case Some(a) => Some(f(a)) 
    } 
} 

,这将引发的错误是:

$ scala 
Welcome to Scala 2.12.0-20161021-070700-8684ae8 (OpenJDK 64-Bit Server VM, Java 1.8.0_112). 
scala> :load tmp.scala 

tmp.scala:17: error: pattern type is incompatible with expected type; 
found : None.type 
required: Option[A] 
      case None => None 
       ^
tmp.scala:17: error: type mismatch; 
found : None.type 
required: Option[B] 
      case None => None 
         ^
tmp.scala:18: error: constructor cannot be instantiated to expected type; 
found : Some[A(in class Some)] 
required: Option[A(in trait Option)] 
      case Some(a) => Some(f(a)) 
       ^
tmp.scala:18: error: type mismatch; 
found : Some[B] 
required: Option[B] 
      case Some(a) => Some(f(a)) 
           ^

我试过各种关于这个codefu的,但都无济于事,就好像它没有检测到正确的子类,由于过时句法?

+1

上面的Option选项定义了两次。 –

+0

谢谢@Michael Zajac,我删除了第一个声明(尽管同样的错误)。 – cirne

+0

它编译得很好。你在哪里编译这个?在一个文件或REPL?什么样的Scala版本(尽管我认为它不重要)? –

回答

3

使用:paste file.scala,它粘贴的内容,而不是:load file.scala,它解释每一行。

+0

这解决了它,谢谢! – cirne