1

Haskellで私は得ました:

data Foo a where
  Bar :: a -> Foo a
  Map :: (a -> b) -> Foo a -> Foo b

instance Functor Foo where
  fmap = Map

Scalaで私が思いついた:

import cats.Functor

trait Foo[A]
case class Bar[A](t: A) extends Foo[A]
case class Map[A,B](fun: A => B,foo: Foo[A]) extends Foo[B]

implicit val fooFunctor: Functor[Foo] = new Functor[Foo] {
  def map[A,B](fa: Foo[A])(f: A => B) = Map(f,fa)
}

しかしBar(40).map(_+2)、私に与えます:

error: value map is not a member of Bar[Int]

私は Scala にかなり慣れていないため、継承の方法がよくわかりません。

私は何が欠けていますか?

4

2 に答える 2

4

Bar(40)明示的にアップキャストしFoo、構文の暗黙をインポートする必要があります。

import cats.syntax.functor._
(Bar(40): Foo[Int]).map(_+2)

Bar[Int]Scala は式の型を推測し、メソッドBar(40)を追加する適切な暗黙の検索を妨げるため、アップキャストが必要です。mapこのため、コンパニオン オブジェクトにアップキャストを行うヘルパー メソッドが表示されることがあります。

object Foo {
  def bar[A](a: A): Foo[A] = Bar(a)
  // etc.
}
于 2016-02-09T00:22:05.410 に答える