私が理解している限り、無料の構築では、任意の Functor を Monad に持ち上げることができます。Cats ライブラリを使用すると、ファンクター インスタンスを提供しなくても、この ADT をモナドに持ち上げることができます。
sealed trait DataA[A]
case class GetData(id: String) extends DataA[String]
case class SaveData(d: String) extends DataA[Unit]
Free が定義されている場合の従来の (単純な) アプローチでも
trait Free[F[_], A]
final case class Pure[F[_], A](a: A) extends Free[F, A]
final case class Suspend[F[_], A](a: F[Free[F, A]]) extends Free[F, A]
継続して ADT をエンコードする必要があります。
sealed trait DataA[A]
case class GetData(id: String, cont: A) extends DataA[A]
case class SaveData(d: String, cont: A) extends DataA[A]
Cats を使用している場合、cont パラメーターを指定する必要はありません。なぜですか?