При чтении статьи "Типы данных a la carte" Wouter Swierstra, я застрял в переводе следующего кода Haskell на Scala:
data Expr f = In (f (Expr f ))
Expr
- это тип данных, используемый для представления арифметических выражений таким образом, что конкретные выражения могут быть записаны следующим образом:
data Val e = Val Int
type IntExpr = Expr Val
data Add e = Add e e
type AddExpr = Expr Add
Моя проблема заключается в реализации f
(который может считаться сигнатурой конструктора) в Scala.
P.S. Определяя копроизведение двух подписей, вы можете позже комбинировать типы данных, получая выражение типа Expr (Val :+: Add )
:
data (f :+: g) e = Inl (f e) | Inr (g e)
addExample :: Expr (Val :+: Add )
addExample = In (Inr (Add (In (Inl (Val 118))) (In (Inl (Val 1219)))))