Я неожиданно обнаружил этот блог-пост , в котором содержатся некоторые хорошие объяснения по переводу «Типы данных по меню» в Scala.Предлагаемое решение выглядит следующим образом:
case class Val[E](i: Int)
case class Add[E](left: E, right: E)
case class Expr[F[X]](e: F[Expr[F]])
sealed trait Sum[F[X], G[X], E]
case class Inl[F[X], G[X], E](l: F[E]) extends Sum[F,G,E]
case class Inr[F[X], G[X], E](r: G[E]) extends Sum[F,G,E]
trait Apply2Of3[F[A[_],B[_],_],A[_],B[_]] {
type It[C] = F[A,B,C]
}
type Tmp[X] = Apply2Of3[Sum,Val,Add]#It[X]
val addExample: Expr[Tmp] = In[Tmp](Inr(Add(In[Tmp](Inl(Val(118))), In[Tmp](Inl(Val(1219))))))
Это далеко не так приятно, как оригинальное (сделанное на Haskell), но весьма полезно в том смысле, что 1) оно демонстрирует, что в целом можно реализовать идеюв Scala, и 2) поднимает некоторые слабости Scala по сравнению с Haskell.