Map vs. FlatMap

zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:Map vs. FlatMap
« Odpověď #75 kdy: 27. 09. 2016, 23:32:41 »
Ve Swiftu:
Kód: [Vybrat]
[[1],[2]].flatMap{$0}
swift neznám, ale řekl bych, že ekvivalentní kód v haskellu by byl join [[1], [2]] - jenže to není odpověď na mou otázku
V tom případě doporučuju tu otázku přeformulovat, evidentně jsem ji špatně pochopil. BTW ekvivalentní není, to by bylo [[1],[2]].flatten()
pomocí syntaxe haskellu:
implementace funkce f
f :: Monad m => m a  -> m a -> m a
tak aby f [1] [2] == [1,2]

Kód: [Vybrat]
f(x,y)=join([x,y])
nebo jen pomocí flatMap
Kód: [Vybrat]
f(x,y)=[x,y]>>=id


v

Re:Map vs. FlatMap
« Odpověď #76 kdy: 27. 09. 2016, 23:42:25 »
Ve Swiftu:
Kód: [Vybrat]
[[1],[2]].flatMap{$0}
swift neznám, ale řekl bych, že ekvivalentní kód v haskellu by byl join [[1], [2]] - jenže to není odpověď na mou otázku
V tom případě doporučuju tu otázku přeformulovat, evidentně jsem ji špatně pochopil. BTW ekvivalentní není, to by bylo [[1],[2]].flatten()
pomocí syntaxe haskellu:
implementace funkce f
f :: Monad m => m a  -> m a -> m a
tak aby f [1] [2] == [1,2]

Kód: [Vybrat]
f(x,y)=join([x,y])
nebo jen pomocí flatMap
Kód: [Vybrat]
f(x,y)=[x,y]>>=id
to ovšem neodpovídá datovému typu, který jsem uvedl, v haskellu je takový kód použitelný pouze pro "List monádu"

zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:Map vs. FlatMap
« Odpověď #77 kdy: 28. 09. 2016, 00:08:24 »
Ve Swiftu:
Kód: [Vybrat]
[[1],[2]].flatMap{$0}
swift neznám, ale řekl bych, že ekvivalentní kód v haskellu by byl join [[1], [2]] - jenže to není odpověď na mou otázku
V tom případě doporučuju tu otázku přeformulovat, evidentně jsem ji špatně pochopil. BTW ekvivalentní není, to by bylo [[1],[2]].flatten()
pomocí syntaxe haskellu:
implementace funkce f
f :: Monad m => m a  -> m a -> m a
tak aby f [1] [2] == [1,2]

Kód: [Vybrat]
f(x,y)=join([x,y])
nebo jen pomocí flatMap
Kód: [Vybrat]
f(x,y)=[x,y]>>=id
to ovšem neodpovídá datovému typu, který jsem uvedl, v haskellu je takový kód použitelný pouze pro "List monádu"
A co má ta funkce jako obecně dělat? Monády se specifikují jen pomocí unit, join a map, z čehož se dá flatMap vždy odvodit. Konkatenace není obecně definovatelná.

v

Re:Map vs. FlatMap
« Odpověď #78 kdy: 28. 09. 2016, 09:36:35 »
Monády se specifikují jen pomocí unit, join a map, z čehož se dá flatMap vždy odvodit. Konkatenace není obecně definovatelná.

původně jsem reagoval na tohle:

Takže mě oprav, na vstupu může být cokoliv, na výstupu je kolekce/pole. Nebo může být na výstupu i Future?
Jistě, na výstupu může cokoliv komplexního (přesněji jakýkoliv komplexní typ splňující monadické zákony)

plyne mi z toho, že je možné sadu monadických hodnot slepit dohromady jenom pomocí "rozhraní" monády/funktoru (>>=,return, fmap), taky aby šlo napsat něco jako moje_flatMap (\i->) [1,2] == [1,2], kde typ výsledku funkce je prostě Monad m => m a - a to se mi nezdá (s přihlédnutím k situaci v knihovnách haskellu, kde se u podobné funkce na výstupu vyskytuje monoid)

ava

Re:Map vs. FlatMap
« Odpověď #79 kdy: 28. 09. 2016, 09:44:01 »
Ve Swiftu:
Kód: [Vybrat]
[[1],[2]].flatMap{$0}
swift neznám, ale řekl bych, že ekvivalentní kód v haskellu by byl join [[1], [2]] - jenže to není odpověď na mou otázku
V tom případě doporučuju tu otázku přeformulovat, evidentně jsem ji špatně pochopil. BTW ekvivalentní není, to by bylo [[1],[2]].flatten()
pomocí syntaxe haskellu:
implementace funkce f
f :: Monad m => m a  -> m a -> m a
tak aby f [1] [2] == [1,2]

Kód: [Vybrat]
f(x,y)=join([x,y])
nebo jen pomocí flatMap
Kód: [Vybrat]
f(x,y)=[x,y]>>=id
to ovšem neodpovídá datovému typu, který jsem uvedl, v haskellu je takový kód použitelný pouze pro "List monádu"

No podle mě to přesně odpovídá datovému typu, který jsi uvedl. Chceš, aby výsledek byl [1,2], tedy aby to byl List, a tím už jsi řekl, na jaké monádě má f pracovat - na Listu (vlastně jsi zafixoval to poslední m z 'f :: Monad m => m a  -> m a -> m a', ale tím jsi přeci zafixoval všechna m.)


v

Re:Map vs. FlatMap
« Odpověď #80 kdy: 28. 09. 2016, 09:51:40 »
No podle mě to přesně odpovídá datovému typu, který jsi uvedl. Chceš, aby výsledek byl [1,2], tedy aby to byl List, a tím už jsi řekl, na jaké monádě má f pracovat - na Listu (vlastně jsi zafixoval to poslední m z 'f :: Monad m => m a  -> m a -> m a', ale tím jsi přeci zafixoval všechna m.)
ty uvedené funkce nemůžou mít datový typ jaký jsem uvedl, pracují přímo s Listem, ale já se ptám na obecnou monádu, funkce, která je definovaná pro všechny monády může pracovat i s Listem, ale funkce definovaná pro List nemůže pracovat s každou monádou

ava

Re:Map vs. FlatMap
« Odpověď #81 kdy: 28. 09. 2016, 10:18:39 »
@v Sorry ale nerozumím. Můžeš prosím znovu co nejsrozumitelněji naformulovat celou otázku v jednom příspěvku bez odkazů na předchozí příspěvky, ať se vyhrabeme z toho zmatku? Díky..

v

Re:Map vs. FlatMap
« Odpověď #82 kdy: 28. 09. 2016, 10:26:49 »
@v Sorry ale nerozumím. Můžeš prosím znovu co nejsrozumitelněji naformulovat celou otázku v jednom příspěvku bez odkazů na předchozí příspěvky, ať se vyhrabeme z toho zmatku? Díky..
to nevím jestli umím :D

IMHO vrcholu srozumitelnosti jsem dosáhl, když jsem se zeptal jestli je možné implementovat tuto funkci:
f :: Monad m => m a  -> m a -> m a
tak aby f [1] [2] == [1,2]
motivace pro tento dotaz je příspěvěk zboj  27. 09. 2016, 15:24:02
(implementace f a b = join [a, b] neodpovídá zadanému datovému typu)

ava

Re:Map vs. FlatMap
« Odpověď #83 kdy: 28. 09. 2016, 11:16:41 »
@v Sorry ale nerozumím. Můžeš prosím znovu co nejsrozumitelněji naformulovat celou otázku v jednom příspěvku bez odkazů na předchozí příspěvky, ať se vyhrabeme z toho zmatku? Díky..
to nevím jestli umím :D

IMHO vrcholu srozumitelnosti jsem dosáhl, když jsem se zeptal jestli je možné implementovat tuto funkci:
f :: Monad m => m a  -> m a -> m a
tak aby f [1] [2] == [1,2]
motivace pro tento dotaz je příspěvěk zboj  27. 09. 2016, 15:24:02
(implementace f a b = join [a, b] neodpovídá zadanému datovému typu)

OK, diky, uz rozumim, rozumim i jak jsi myslel to ze f a b = join [a, b] neodpovida datovemu typu - je to naopak nez jsem psal nahore - [] nelze v implementaci pouzit, tim bych tvrdil ze Monad musi byt List monad, coz nechci.

Zajimava otazka, aspon mam nad cim premyslet, jsem v tomhle oboru zacatecnik, tak se aspon procvicim :)

ava

Re:Map vs. FlatMap
« Odpověď #84 kdy: 28. 09. 2016, 11:26:24 »
@v Sorry ale nerozumím. Můžeš prosím znovu co nejsrozumitelněji naformulovat celou otázku v jednom příspěvku bez odkazů na předchozí příspěvky, ať se vyhrabeme z toho zmatku? Díky..
to nevím jestli umím :D

IMHO vrcholu srozumitelnosti jsem dosáhl, když jsem se zeptal jestli je možné implementovat tuto funkci:
f :: Monad m => m a  -> m a -> m a
tak aby f [1] [2] == [1,2]
motivace pro tento dotaz je příspěvěk zboj  27. 09. 2016, 15:24:02
(implementace f a b = join [a, b] neodpovídá zadanému datovému typu)

Hmm, řekl bych že to nejde. U listu to vypadá v pohodě, ale jak by vůbec měl vypadat očekávaný výsledek třeba na Maybe?

f (Just 1) (Just 2) = ??

Pravda, není to moc rigorózní úvaha, ale intuitivně se mi zdá, že f tak jak ho chceš naimplementovat nejde.

v

Re:Map vs. FlatMap
« Odpověď #85 kdy: 28. 09. 2016, 11:48:33 »
@v Sorry ale nerozumím. Můžeš prosím znovu co nejsrozumitelněji naformulovat celou otázku v jednom příspěvku bez odkazů na předchozí příspěvky, ať se vyhrabeme z toho zmatku? Díky..
to nevím jestli umím :D

IMHO vrcholu srozumitelnosti jsem dosáhl, když jsem se zeptal jestli je možné implementovat tuto funkci:
f :: Monad m => m a  -> m a -> m a
tak aby f [1] [2] == [1,2]
motivace pro tento dotaz je příspěvěk zboj  27. 09. 2016, 15:24:02
(implementace f a b = join [a, b] neodpovídá zadanému datovému typu)

Hmm, řekl bych že to nejde. U listu to vypadá v pohodě, ale jak by vůbec měl vypadat očekávaný výsledek třeba na Maybe?

f (Just 1) (Just 2) = ??

Pravda, není to moc rigorózní úvaha, ale intuitivně se mi zdá, že f tak jak ho chceš naimplementovat nejde.
ohledně Maybe, pro inspiraci bych se podíval na Data.Monoid
já nevím jestli to jde, ale objevila se tady myšlenka, že výstupní typ flatMap má být monáda a to stačí, to je v rozporu s mou představou o flatMap i s tím co (si myslím že) vím o monádách, no a tak se ptám

zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:Map vs. FlatMap
« Odpověď #86 kdy: 28. 09. 2016, 11:51:26 »
@v Sorry ale nerozumím. Můžeš prosím znovu co nejsrozumitelněji naformulovat celou otázku v jednom příspěvku bez odkazů na předchozí příspěvky, ať se vyhrabeme z toho zmatku? Díky..
to nevím jestli umím :D

IMHO vrcholu srozumitelnosti jsem dosáhl, když jsem se zeptal jestli je možné implementovat tuto funkci:
f :: Monad m => m a  -> m a -> m a
tak aby f [1] [2] == [1,2]
motivace pro tento dotaz je příspěvěk zboj  27. 09. 2016, 15:24:02
(implementace f a b = join [a, b] neodpovídá zadanému datovému typu)

Hmm, řekl bych že to nejde. U listu to vypadá v pohodě, ale jak by vůbec měl vypadat očekávaný výsledek třeba na Maybe?

f (Just 1) (Just 2) = ??

Pravda, není to moc rigorózní úvaha, ale intuitivně se mi zdá, že f tak jak ho chceš naimplementovat nejde.
Aby to dávalo smysl, monáda musí být aditivní, pak stačí funkci definovat jako x++y. Tím jsme ale dost odbočili od flatMap.

zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:Map vs. FlatMap
« Odpověď #87 kdy: 28. 09. 2016, 11:52:46 »
@v Sorry ale nerozumím. Můžeš prosím znovu co nejsrozumitelněji naformulovat celou otázku v jednom příspěvku bez odkazů na předchozí příspěvky, ať se vyhrabeme z toho zmatku? Díky..
to nevím jestli umím :D

IMHO vrcholu srozumitelnosti jsem dosáhl, když jsem se zeptal jestli je možné implementovat tuto funkci:
f :: Monad m => m a  -> m a -> m a
tak aby f [1] [2] == [1,2]
motivace pro tento dotaz je příspěvěk zboj  27. 09. 2016, 15:24:02
(implementace f a b = join [a, b] neodpovídá zadanému datovému typu)

Hmm, řekl bych že to nejde. U listu to vypadá v pohodě, ale jak by vůbec měl vypadat očekávaný výsledek třeba na Maybe?

f (Just 1) (Just 2) = ??

Pravda, není to moc rigorózní úvaha, ale intuitivně se mi zdá, že f tak jak ho chceš naimplementovat nejde.
ohledně Maybe, pro inspiraci bych se podíval na Data.Monoid
já nevím jestli to jde, ale objevila se tady myšlenka, že výstupní typ flatMap má být monáda a to stačí, to je v rozporu s mou představou o flatMap i s tím co (si myslím že) vím o monádách, no a tak se ptám
flatMap má typ ma->(a->mb)->mb. Kde přesně je ten rozpor?
« Poslední změna: 28. 09. 2016, 12:00:08 od zboj »

v

Re:Map vs. FlatMap
« Odpověď #88 kdy: 28. 09. 2016, 12:02:55 »
flatMap má typ ma->(a->ma)->ma. Kde přesně je ten rozpor?
já si představuju typ t a -> (a -> m b) -> m b, jednak jste mluvil o monádě na výstupu, což IMHO znamená, že na vstupu je něco jiného, druhak Data.Foldable.foldMap (se jeví takový pohodlnější) a za třetí ten váš flatMap je dost omezený co se týče mapování samotného (a -> a), ale to je asi překlep

ava

Re:Map vs. FlatMap
« Odpověď #89 kdy: 28. 09. 2016, 12:03:38 »
@v Sorry ale nerozumím. Můžeš prosím znovu co nejsrozumitelněji naformulovat celou otázku v jednom příspěvku bez odkazů na předchozí příspěvky, ať se vyhrabeme z toho zmatku? Díky..
to nevím jestli umím :D

IMHO vrcholu srozumitelnosti jsem dosáhl, když jsem se zeptal jestli je možné implementovat tuto funkci:
f :: Monad m => m a  -> m a -> m a
tak aby f [1] [2] == [1,2]
motivace pro tento dotaz je příspěvěk zboj  27. 09. 2016, 15:24:02
(implementace f a b = join [a, b] neodpovídá zadanému datovému typu)

Hmm, řekl bych že to nejde. U listu to vypadá v pohodě, ale jak by vůbec měl vypadat očekávaný výsledek třeba na Maybe?

f (Just 1) (Just 2) = ??

Pravda, není to moc rigorózní úvaha, ale intuitivně se mi zdá, že f tak jak ho chceš naimplementovat nejde.
Aby to dávalo smysl, monáda musí být aditivní, pak stačí funkci definovat jako x++y. Tím jsme ale dost odbočili od flatMap.

Nojo, tak to je ale trochu podvod :) Ale interpretuju to tak, že na Monad f implementovat nejde, na MonadPlus jo.