Cześć, takie pytanie się naroziło w mojej głowie:
Problem - trzeba zamodelować sytuacje wszystkie elementy albo kilka elementów
W Haskellu można to zapisać jak
data AllOrSeveral a = AllOrSeveral (Maybe [a])
lub chyba ładniej:
data AllOrSeveral a = All | Several [a]
A potem będzie trzeba zaimplementować TypeClasse Semigroup.Monad
W Scali będzie np:
case class AllOrSeveral[A](severalOpt: Option[Seq[A]]) {
def ++(other: AllOrSeveral[A]) = //..
// def map[B](f: A => B): AllOrSeveral[B] = AllOrSeveral(severalOpt.map(_.map(f)))
// def flatMap ...
}
Główna różnica w zachowaniu jest taka że:
- normalnie
None ++ Some(Seq(a1, a2, a3))
wynosiSome(Seq(a1, a2, a3))
boNone
to zero - tutaj
All++ Several(a1, a2, a3)
wynosiAll
boAll
to wszystko
Dodawanie normalne się oczywiście nie zmienia - Several(a1, a2, a3) ++ Several(a4, a5, a6)
wynosi Several(a1, a2, a3, a4, a5, a6)
Ktoś wie czy taka monada semigrupa jest jakoś mądrze nazwana? Nie lubię nazw z Or
:P