2013-08-29 3 views
1

Работая больше на FP in Scala пример, я пытался реализовать map функции Option черта, как показано ниже:Реализация карты на Варианте

sealed trait MyOption[+A] { 
    def map[B](f: A => B): Option[B] = this match { 
     case Some(a) => Some(f(a)) 
     case _ => None 
    } 
} 

Однако время компиляции ошибки показать, если я правильно понимаю, что я не правильное соответствие шаблону для случая Some(A). Используя сопоставление шаблонов, как я могу написать первый случай, чтобы получить некоторые (A) значения, чтобы они совпадали?

>scalac MyOption.scala 
MyOption.scala:3: error: constructor cannot be instantiated to expected type; 
found : Some[A(in class Some)] 
required: MyOption[A(in trait MyOption)] 
       case Some(a) => Some(f(a)) 
        ^
MyOption.scala:3: error: not found: value a 
       case Some(a) => Some(f(a)) 
            ^
two errors found 
+2

Вы смешиваете опцию и MyOption, возвращаемый тип карты MyOption # должен быть MyOption, а не Option. вы уверены, что некоторые, которые вы используете, являются MyOption, а не опцией? – stew

ответ

4

Вы пытаетесь определить карту с точки зрения некоторых и None, которые являются подклассами Scala предоставленного опциона признака, а не с точки зрения подклассов вашего собственного признака. Попробуйте что-нибудь вроде:

sealed trait MyOption[+A] { 
    import MyOption._ 
    def map[B](f: A => B): MyOption[B] = this match { 
     case MySome(a) => MySome(f(a)) 
     case _ => MyNone 
    } 
} 

object MyOption { 
    case class MySome[+A](a: A) extends MyOption[A] 
    case object MyNone extends MyOption[Nothing] 
} 
Смежные вопросы