Map vs. FlatMap

Sancho

Map vs. FlatMap
« kdy: 22. 09. 2016, 15:24:31 »
Trochu tápu ve funkcionálním přístupu, jaký je pls rozdíl mezi map a flatMap?


JSH

Re:Map vs. FlatMap
« Odpověď #1 kdy: 22. 09. 2016, 15:39:29 »
O jaký jazyk a knihovnu jde?

Jestli jde o Stream v Javě, tak map transformuje jeden prvek na jeden prvek. flatMap transformuje každý prvek na seznam 0-N prvků a seznamy pro jednotlivé vstupní prvky pospojuje do jednoho dlouhého seznamu.

FlatMap je složenina map z prvku na seznam a "flattening" což je pospojování seznamu seznamů.

Kit

Re:Map vs. FlatMap
« Odpověď #2 kdy: 22. 09. 2016, 15:53:05 »
Trochu tápu ve funkcionálním přístupu, jaký je pls rozdíl mezi map a flatMap?

Map je kolekcí dvojic (klíč, hodnota).

FlatMap je jednoduchý seznam, ve kterém se střídají klíče a jejich hodnoty.

Re:Map vs. FlatMap
« Odpověď #3 kdy: 22. 09. 2016, 16:17:52 »
Trochu tápu ve funkcionálním přístupu, jaký je pls rozdíl mezi map a flatMap?

Map je kolekcí dvojic (klíč, hodnota).

FlatMap je jednoduchý seznam, ve kterém se střídají klíče a jejich hodnoty.

Tak to vazne neni spravna odpoved v tomhle kontextu.

Trochu tápu ve funkcionálním přístupu, jaký je pls rozdíl mezi map a flatMap?

Pseudokodem:

Kód: [Vybrat]
[1,2,3].map (*2) 
[2,3,4]

["1", "21", "foo"].map (length) 
[1,2,3]


Just(2).map(*2)
Just(4)

[1,2,3].flatMap (a -> [a, 2*a])
[1,2,2,4,4,3,6]


map vezme nejaky "kontejner" (ve skutecnosti neco obecnejsiho, ale tim se ted netrap), jako je List nebo Maybe, ve kterem jsou prvky typu T a na kazdy prvek aplikuje nejakou fuknci z T na K. Vysledek je ten samy druh kontejneru, ve kterem jsou prvky typu K.

flatMap na ten samy kontejner muze aplikovat funkci, ktera z prvku typu T udela kontejner prvku typu K. A vysledek se slepi opet do kontejneru typu K.

Re:Map vs. FlatMap
« Odpověď #4 kdy: 22. 09. 2016, 16:22:10 »
A to same obrazkem:



versus
.
.



(obazky jsou soucasti http://reactivex.io/ ktere doporucuji okoukat)



bastardier

Re:Map vs. FlatMap
« Odpověď #6 kdy: 23. 09. 2016, 10:29:54 »
Map není vs. Flatmap
Flatmap je map a flatten.
Flatten funguje sám o sobě, stejně jako map.
Map vyzvedne prvek typu a, zavolá fci a->b a připojí prvek b.
Flatten vezme typ kolekce kolekcí a udělá kolekci a.

Například mám seznam klíčů a fci která vrátí Optional. Flatmap vrátí rovnou seznam bez prvků kterém jsou prázdné.
To chybí v Javě protože optional neimplementuje Stream.

Natix

Re:Map vs. FlatMap
« Odpověď #7 kdy: 23. 09. 2016, 17:33:37 »
FlatMap je v podstatě obecnější funkce než map, protože jak map, tak filter lze implementovat pomocí flatMapu.

Pseudo-Scala:
Kód: [Vybrat]
class List {
  def map(function) = flatMap { item => List(function(item)) }
  def filter(predicate) = flatMap { item => if (predicate(item)) List(item) else List() }
}

mrk

Re:Map vs. FlatMap
« Odpověď #8 kdy: 23. 09. 2016, 23:52:35 »
flatMap je monada ;-)

map muze produkovat seznamy seznamu, pak je problem nacpat to do reduce. flatMap to vsechno vrati v jednom seznamu, kde vsechny objekty nejsou seznamy. krome toho je to monada v Haskellu, takze tim jde simulovat I/O a imperativni programco.

map -> [0,[1],[2,[3],[4]]]
flatMap -> [0,1,2,3,4]


Re:Map vs. FlatMap
« Odpověď #9 kdy: 24. 09. 2016, 07:49:54 »
flatMap je monada ;-)

map muze produkovat seznamy seznamu, pak je problem nacpat to do reduce. flatMap to vsechno vrati v jednom seznamu, kde vsechny objekty nejsou seznamy. krome toho je to monada v Haskellu, takze tim jde simulovat I/O a imperativni programco.

map -> [0,[1],[2,[3],[4]]]
flatMap -> [0,1,2,3,4]


Dvě technické: flatMap není monáda, na to nestačí (a chtěl jsem se tomuhle při vysvětlování vyhnout, když se někdo ptá na map vs. flatmap, tak mu to nepomůže.)

Ten příklad, co jsi napsal, nedává úplně smysl. Ta věc u mapu nejde v  haskellu napsat a ten výsledek flatmap ti klidně vypadne i z mapu, záleží, co na čím mapuješ.

zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:Map vs. FlatMap
« Odpověď #10 kdy: 24. 09. 2016, 17:16:45 »
flatMap je monada ;-)

map muze produkovat seznamy seznamu, pak je problem nacpat to do reduce. flatMap to vsechno vrati v jednom seznamu, kde vsechny objekty nejsou seznamy. krome toho je to monada v Haskellu, takze tim jde simulovat I/O a imperativni programco.

map -> [0,[1],[2,[3],[4]]]
flatMap -> [0,1,2,3,4]


Dvě technické: flatMap není monáda, na to nestačí (a chtěl jsem se tomuhle při vysvětlování vyhnout, když se někdo ptá na map vs. flatmap, tak mu to nepomůže.)

Ten příklad, co jsi napsal, nedává úplně smysl. Ta věc u mapu nejde v  haskellu napsat a ten výsledek flatmap ti klidně vypadne i z mapu, záleží, co na čím mapuješ.
Doplnění: monáda, když už teda, by bylo "map" (jakožto funktor) spolu s "unit" a "join" (přirozené transformace), přičemž join=flatten.

Kit

Re:Map vs. FlatMap
« Odpověď #11 kdy: 24. 09. 2016, 22:04:59 »
Map je kolekcí dvojic (klíč, hodnota).

FlatMap je jednoduchý seznam, ve kterém se střídají klíče a jejich hodnoty.

Tak to vazne neni spravna odpoved v tomhle kontextu.

map vezme nejaky "kontejner" (ve skutecnosti neco obecnejsiho, ale tim se ted netrap), jako je List nebo Maybe, ve kterem jsou prvky typu T a na kazdy prvek aplikuje nejakou fuknci z T na K. Vysledek je ten samy druh kontejneru, ve kterem jsou prvky typu K.

flatMap na ten samy kontejner muze aplikovat funkci, ktera z prvku typu T udela kontejner prvku typu K. A vysledek se slepi opet do kontejneru typu K.

Popsal jsi totéž - pouze z jiného pohledu a mnohem složitěji.

Re:Map vs. FlatMap
« Odpověď #12 kdy: 25. 09. 2016, 03:35:21 »
Map je kolekcí dvojic (klíč, hodnota).

FlatMap je jednoduchý seznam, ve kterém se střídají klíče a jejich hodnoty.

Tak to vazne neni spravna odpoved v tomhle kontextu.

map vezme nejaky "kontejner" (ve skutecnosti neco obecnejsiho, ale tim se ted netrap), jako je List nebo Maybe, ve kterem jsou prvky typu T a na kazdy prvek aplikuje nejakou fuknci z T na K. Vysledek je ten samy druh kontejneru, ve kterem jsou prvky typu K.

flatMap na ten samy kontejner muze aplikovat funkci, ktera z prvku typu T udela kontejner prvku typu K. A vysledek se slepi opet do kontejneru typu K.

Popsal jsi totéž - pouze z jiného pohledu a mnohem složitěji.

Ne.
map není v tomhle kontextu (pokud nechceš vážně zamotat hlavu tazateli, co očividně začíná) žádná kolekce dvojic, je to funkce vyššího řádu. Podobně u flatmap.

mrk

Re:Map vs. FlatMap
« Odpověď #13 kdy: 25. 09. 2016, 05:12:18 »
Dvě technické: flatMap není monáda, na to nestačí (a chtěl jsem se tomuhle při vysvětlování vyhnout, když se někdo ptá na map vs. flatmap, tak mu to nepomůže.)

Ten příklad, co jsi napsal, nedává úplně smysl. Ta věc u mapu nejde v  haskellu napsat a ten výsledek flatmap ti klidně vypadne i z mapu, záleží, co na čím mapuješ.

Jo, s Haskellem mas pravdu, taky jsem se s tim nechtel do detailu parat, a co jsem napsal bylo pro Spark, jestli to nekdo dela distribuovane, kde funkcionalni pristup je zasadni, zatim co Haskell na jednom kompu je vice-mene optional ;-)

Kit

Re:Map vs. FlatMap
« Odpověď #14 kdy: 25. 09. 2016, 10:06:04 »
Popsal jsi totéž - pouze z jiného pohledu a mnohem složitěji.

Ne.
map není v tomhle kontextu (pokud nechceš vážně zamotat hlavu tazateli, co očividně začíná) žádná kolekce dvojic, je to funkce vyššího řádu. Podobně u flatmap.

To zní docela kategoricky. Jako kdyb sis byl svým tvrzením zcela jist.

Nechtěl bys ty své funkce vyššího řádu alespoň popsat srozumitelněji, aby to tazatel pochopil? Ty obrázky vypadají spíš jako můj popis datových struktur.