2

アップデート

この質問はAnyAin に置き換えることに関するものstep(x.flatMap((a: Any) => f(a).flatMap(g)))です。パターン マッチングでの型消去は、これを困難にしているようです。

def step[F[_], A](freeFA: Free[F,A]): Free[F,A] =
  freeFA match {
    case FlatMap(
      FlatMap(x, f), g
    ) => step(x.flatMap((a: Any) => f(a).flatMap(g)))
    .
    .
    .

  }

Free モナドは質問の核心とは無関係であるというコメントのポイントに感謝します。必要な私の例には、ジェネリック型Aとジェネリック型F[_](より高い種類の型?) が含まれます。

それは衒学的な質問であり、「型消去を回避する方法」( Scala で型消去を回避するにはどうすればよいですか? または、コレクションの型パラメーターを取得できないのはなぜですか? ) を知りたいと思っています。コードがコンパイルされます。これに TypeTags を自分で適用する方法がわかりませんでした。

静的型チェックについての言及は役に立ちます。が動的型チェックではなく静的型チェックによってAny設定される理由を誰かが説明してくれますか? Aここでは、型の消去によって静的な型チェックが不可能になり、コンパイラは動的な型チェックに戻っAnyA. ありがとうございました


私は3つのケースクラスを持っています。

case class Return[F[_],A](a: A) extends Free[F, A]
case class Suspend[F[_],A](s: F[A]) extends Free[F, A]
case class FlatMap[F[_],A,B](s: Free[F, A],
  f: A => Free[F, B]) extends Free[F, B]

trait から継承するものFree:

sealed trait Free[F[_],A] {
  def flatMap[B](f: A => Free[F,B]): Free[F,B] =
    FlatMap(this, f)
  def map[B](f: A => B): Free[F,B] =
    flatMap(f.andThen(Return(_)))
  }

step、および上記のクラスは、トランポリンを実装するための「Scala での関数型プログラミング」の第 13 章の演習の一部です。

型消去は 内の型注釈を思いとどまらせるためcase FlatMap(FlatMap(x, f), g)、このケース内のジェネリック型は未指定のままであり、Any具象化されたときになります。次に、に与えられた無名関数の必要な署名は にx.flatMapなりAny=>Free[F,A]ます。この関数に必要な署名はA=>Free[F,A]、実行時の真の署名です。

def step[F[_], A](freeFA: Free[F,A]): Free[F,A] =
  freeFA match {
    case FlatMap(
      FlatMap(x, f), g
    ) => step(x.flatMap((a: Any) => f(a).flatMap(g)))
    .
    .
    .

  }

flatMapasに与えられた無名関数の入力型に注釈を付けると、Aコンパイルが失敗します。

step(x.flatMap((a: A) => f(a).flatMap(g)))

これはAのサブセットにすぎないためだと理解していAnyます:

 [error]  found   : A => fpinscala.iomonad.IO3.Free[F,A]
 [error]  required: Any => fpinscala.iomonad.IO3.Free[F,A]

型消去により、次のように絞り込むことができなくAnyなります。A

def step[F[_], A](freeFA: Free[F,A]): Free[F,A] =
  freeFA match {
    case FlatMap(
      FlatMap(
        x: Free[F,A],
        f: Function1[A,Free[F,A]]
      ),
      g: Function1[A,Free[F,A]]
    ) => step(x.flatMap((a: A) => f(a).flatMap(g)))
   .
   .
   .
  }

このようにステートメントに注釈を付けることcaseは、ドキュメント化以外の目的を果たさず、問題を引き起こすことさえあります。

この状況に TypeTags を適用する方法がわかりません。

このステートメントにどのように注釈を付けcaseてノックダウンAnyできAますか? ありがとう!!

4

0 に答える 0