Domanda

Ho giocato con Scalaz per avere un po 'della sensazione di Haskell in Scala. Per capire come funzionano le cose in Scala, ho iniziato a implementare varie strutture algebriche e mi sono imbattuto in un comportamento che è stato menzionato dalla gente di Scalaz.

Ecco il mio codice di esempio che implementa un funtor:

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))                                                    
  }
}

Ho scritto un'istanza FUNCTOR per l'opzione e un falso sumtype foo. Il problema è che Scala non può dedurre il parametro implicito senza un'annotazione di tipo esplicita o un metodo wrapper

def some[A](a: A): Option[A] = Some(a)

println(fmap (Bar(): Foo[Int])((_: Int) + 1))

Scala dà i tipi come functor [bar] e functor [alcuni] senza quelle soluzioni.

Perché? Qualcuno potrebbe indicarmi la sezione nelle specifiche linguistiche che definiscono questo comportamento?

Saluti, Raichoo

Nessuna soluzione corretta

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top