私はCats/Scalazの基本的な例を取り乱していて、チュートリアルを通って気分を味わってきました。に解決策があります。サブクラス(cats/scalaz)を使用してFunctorでジェネリック関数を呼び出す
Funerビュー(F[_] : Functor
)でコンテキスト化された値(F[A]
)と、コンテキストが<: F
の汎用関数を呼び出すことはできますか?私はFunctorがタイプF[_]
で不変であることを認識しており、Functor.widen
の存在も認識していますが、一般的な関数で使用するために暗黙的に自分のタイプを広げる方法がないことは奇妙に思えます。猫で
例(Scalazと同様の例が同様に存在する):明示的にオプションのためのFunctorを召喚、もちろん
import cats.instances.all._
import cats.syntax.all._
def takesAFunctor[F[_] : cats.Functor](f: F[Int]) = f.map(_ + 1)
takesAFunctor(Option(1)) // Works fine (of course)
takesAFunctor(Some(1)) // No implicit for Functor[Some]. Makes sense, but can we summon one since we have a Functor[Option]?
takesAFunctor(Some(1): Option[Int]) // Works but very verbose
をし、マッピングが期待
Functor[Option].map(Some(1))(_ + 1) // Some(2)
だから私の質問のように動作しますは:一般的な関数のシグネチャは、サブクラス化されたコンテキストについて説明するために変更する必要がありますか、私は知らない何らかの「暗黙の広がり」があるか、これを使ってScalaの関数型プログラミングの不幸な欠点ですstdlib?
A-ha!これはまさに私が探していたものでした。ありがとうございました!私は、関数の分散を考慮に入れることを完全に無視しました。それはかなり意味があります。 –