Czy istnieje <del>modana</del> semigrupa "AllOrSeveral" a jeśli tak to jak się nazywa?

0

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 Monad Semigroup.
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)) wynosi Some(Seq(a1, a2, a3)) bo None to zero
  • tutaj All++ Several(a1, a2, a3) wynosi All bo All 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

0

A jak przeiterujesz po czymś takim? :]

Przypomina mi się rozkmina o intensional set vs extensional set https://en.wikipedia.org/wiki/Extensional_and_intensional_definitions którą https://github.com/paulp prowadził kiedyś w kontekście Scali (ale tego na szybko nie znalazłem).

0
Wibowit napisał(a):

A jak przeiterujesz po czymś takim? :]

Zmuszasz mnie do napisania kodu którego nie chciało mi się pisać :P
W moim przypadku wystarczy

  def map[B](f: A => B): AllOrSeveral[B] = AllOrSeveral(severalOpt.map(_.map(f)))
1

Ale czemu piszesz modanie, a potem definiujesz (++)? To ma być monada czy nie?
A tak poza tym to jest to po prostu mnożenie przez 0. (All to 0, a ++ to mnożenie). Czyli trzeba, by poszukać pod hasłem pierścień (ring/rink).

0
jarekr000000 napisał(a):

Ale czemu piszesz modanie, a potem definiujesz (++)? To ma być monada czy nie?

Racja. Pierścień/Semigroup wystarczy. Potrzebuję tylko jedną operację <>

A tak poza tym to jest to po prostu mnożenie przez 0. (All to 0, a ++ to mnożenie).

Zrozumiałem :D Ale to pokręcone :D

1

Ja dopiero teraz zacząłem rozkminiać:
weźmy jako dodawanie:
zbiory i operację przecięcia - element neutralny - zbiór wszystkiego :-)
do tego jako mnożenie:
zbiory i operację sumy - element neutralny - 'zbiów pusty'.
I pytanie co z tego powstaje... pierścień z jedynką- chyba tak.

0

Hm, Nikt (Algebra.Ring Data.Ring nie definiuje chyba pierścienia z samym mnożeniem bez dodawania :D
BTW jak to nazwę Ring to już na pewno mi nie przejdzie Review :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1