1

Scala の例で FP にさらに取り組んで、次のようにOptionトレイトの関数を実装しようとしました。map

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

ただし、コンパイル時のエラーは、私が正しく理解していれば、Some(A). パターン マッチングを使用して、一致する Some(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
4

1 に答える 1

5

独自のトレイトのサブクラスではなく、Scala が提供する Option トレイトのサブクラスである Some および None に関して map を定義しようとしています。次のようなものを試してください:

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]
}
于 2013-08-29T03:02:23.130 に答える