SCALA:タイプの推論とサブタイプ/ハイキャンドタイプ
-
29-10-2019 - |
質問
Scalazと遊んで、Haskellの感覚をScalaに少し手に入れました。 Scalaで物事がどのように機能するかを理解するために、私は自分でさまざまな代数構造の実装を開始し、Scalazの人々が言及した行動に出会いました。
これが私の例コードです。
trait Functor[M[_]] {
def fmap[A, B](a: M[A], b: A => B): M[B]
}
sealed abstract class Foo[+A]
case class Bar[A]() extends Foo[A]
case class Baz[A]() extends Foo[A]
object Functor {
implicit val optionFunctor: Functor[Option] = new Functor[Option]{
def fmap[A, B](a: Option[A], b: A => B): Option[B] = a match {
case Some(x) => Some(b(x))
case None => None
}
}
implicit val fooFunctor: Functor[Foo] = new Functor[Foo] {
def fmap[A, B](a: Foo[A], b: A => B): Foo[B] = a match {
case Bar() => Bar()
case Baz() => Baz()
}
}
}
object Main {
import Functor._
def some[A](a: A): Option[A] = Some(a)
def none[A]: Option[A] = None
def fmap[M[_], A, B](a: M[A])(b: A => B)(implicit f: Functor[M]): M[B] =
f.fmap(a, b)
def main(args: Array[String]): Unit = {
println(fmap (some(1))(_ + 1))
println(fmap (none)((_: Int) + 1))
println(fmap (Bar(): Foo[Int])((_: Int) + 1))
}
}
オプション用のファンチャーインスタンスと偽のsumtype fooを作成しました。問題は、SCALAが明示的なタイプの注釈またはラッパー方法なしで暗黙のパラメーターを推測できないことです
def some[A](a: A): Option[A] = Some(a)
println(fmap (Bar(): Foo[Int])((_: Int) + 1))
Scalaは、これらの回避策なしにfunctor [bar]やfunctor [Some]などのタイプを導入します。
何故ですか?この動作を定義する言語仕様のセクションを教えてください。
よろしく、ライチョ
正しい解決策はありません
所属していません StackOverflow