Чтобы сделать что-либо работоспособным в контексте монады, если использовать Haskell - я просто добавляю реализацию класса Monad для заданного типа в любом месте. Поэтому я вообще не касаюсь источника определения типа данных. Как (что-то искусственное)
data Z a = MyZLeft a | MyZRight a
swap (MyZLeft x) = MyZRight x
swap (MyZRight x) = MyZLeft x
instance Monad Z where
return a = MyZRight a
(>>=) x f = case x of
MyZLeft s -> swap (f s)
MyZRight s -> swap (f s)
поэтому я не касаюсь определения Z, но сделаю его монадой
Как это сделать в Scala? Кажется, что нет возможности помимо смешения некоторых признаков и определения методов map/flatMap/filter/withFilter?