質問

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]などのタイプを導入します。

何故ですか?この動作を定義する言語仕様のセクションを教えてください。

よろしく、ライチョ

正しい解決策はありません

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top