Avatar
hanpari
Redaktor
Avatar
hanpari:

Ahoj,
tady jsem narazil na pěkný kód v Fsharpu:

let btnUp = new Button("Increment", Visible=true)
let btnDown = new Button("Decrement", Visible=true)
let lbl = new Label(Text=" Count: 0", Visible=true)

Event.merge
(btnUp.Clicked |> Event.map (fun _ -> +1))
(btnDown.Clicked |> Event.map (fun _ -> -1))
|> Event.scan (+) 0
|> Event.map (sprintf " Count: %d")
|> Event.add (fun s -> lbl.Text <- s)

V principu je mi jasné, co dělá, ale moc nechápu jednotlivé kroky, počínaje funkcí Event.scan.
Přesněji řečeno, chápu, že do Event.scan vstupuje nějaká sloučená událost, ale pak nevím, co se děje a co je výstup?
Dalším řádkům už pak zase rozumím.

Pokud by mi to někdo dokázal vysvětlit, byl bych rád. pro jistotu dodám, že ty prvky patří do knihovny GTK+

 
Odpovědět 27.1.2015 11:49
Avatar
kopecky.filip:

Ahoj, nejdřív bych to přepsal do názornější podoby, správně by to mělo bejt celý na jednom řádku:

Event.add (fun s -> lbl.Text <- s)
Event.map (sprintf " Count: %d")
Event.scan (+) 0
Event.merge
(Event.map (fun _ -> +1) btnUp.Clicked)
(Event.map (fun _ -> -1) btnDown.Clicked)

Jednoduše se to dá popsat tak, že se tlačítkům přiřadí funkce na handlování eventů, pak se spojí, pak se kumuluje výsledek z každého volání, k tomu se přilepí "count", a pak se to vypíše do labelu.
Tyto všechny metody jsou popsané na https://msdn.microsoft.com/…e340422.aspx , já osobně jsem je do teď neznal.

Nahoru Odpovědět  +1 27.1.2015 14:49
Není důležité, kdo má pravdu, ale že se ví, jaká je. -já
Avatar
hanpari
Redaktor
Avatar
Odpovídá na kopecky.filip
hanpari:

Díky za přepis a odkaz, ale právě funkce Event.scan mi není o moc jasnější :) A to ani s pomocí MSDN

https://msdn.microsoft.com/…e620668.aspx

 
Nahoru Odpovědět 27.1.2015 20:14
Avatar
kopecky.filip:

:-) Mně osobně se tenhle zápis strašně moc líbí, mimo jiné proto, že v obvyklých jazycích není možnej.
Začne to na nule a při každým volání toho eventu to přičte hodnotu, co to dostane - v tomhle případě 1 nebo -1, po přičtení to "uloží" na příště a vratí tu hodnotu. V podstatě nějak takle:

let Event.Scan f seed =
    //f dostane (+), coz se chova jako (fun a b -> a + b)
    let a = seed
    //rekneme, ze sem se nam to vrati z toho eventu, nevim, jak se to spravne dela
    a <- f a Event.Callback()
    a

Snad už je to jasnější. Jestli ne, rád upřesním.
Právě jsem dostal nápad, jak by se to dalo vysvětlit přesněji, ale musel bych se nad tím zamyslet, jestli to takle ještě není úplně jasný, tak to dotáhnu k dokonalosti a správnosti.

Editováno 27.1.2015 22:00
Nahoru Odpovědět 27.1.2015 21:58
Není důležité, kdo má pravdu, ale že se ví, jaká je. -já
Avatar
hanpari
Redaktor
Avatar
Odpovídá na kopecky.filip
hanpari:

Zápis se mi také líbí.
Opravdu ti ten tvůj kód funguje?

let a = seed
 a <- f a Event.Callback()

a binduješ jako immutable a v dalším řádku se ho snažíš změnit. Ale třeba mi něco uniká.

Budu rád za každý srozumitelný příklad. Díky :)

 
Nahoru Odpovědět 28.1.2015 6:23
Avatar
kopecky.filip:

Jsem si celkem jistej, že to nefunguje, to měl bejt jenom náznak, snažil jsem se to napsat v tom komentu nad tím.
Zapoměl jsem mutable, moje chyba. Takle by to mělo bejt lepší, kdyby to mělo bejt funkční, tak by bylo potřeba použít něco na styl struktury, třídy nebo refu:

let Event.Scan f seed = //deklarace jako Event.Scan taky nefunguje
    let mutable a = seed
    (fun b -> a <- f a b; b)//mutable proměnná se nedá capturnout, takže tohle taky nefunguje

Princip spočívá v tom, že se uloží počáteční hodnota a při každém zavolání se na ni a hodnotu vrácenou tím handlerem o úroveň níž zavolá funkce (+), takže se postupně přičítá nebo odečítá podle toho, jak jsou mačkána tlačítka.

Editováno 28.1.2015 10:21
Nahoru Odpovědět 28.1.2015 10:20
Není důležité, kdo má pravdu, ale že se ví, jaká je. -já
Avatar
hanpari
Redaktor
Avatar
Odpovídá na kopecky.filip
hanpari:

Díval jsem se na své nejoblíbenější stránky o F# a našel jsem tam toto:

http://fsharpforfunandprofit.com/…cy-reactive/

Později na to mrknu. Ale díky za objasnění. Budu si to muset vyzkoušet, až pochopím, jak v Xamarinu funguje GTK :)

 
Nahoru Odpovědět 28.1.2015 10:56
Avatar
hanpari
Redaktor
Avatar
Odpovídá na kopecky.filip
hanpari:

Mimochodem, co myslíš tím, že "mutable proměnná se nedá capturnout?"

 
Nahoru Odpovědět 28.1.2015 10:59
Avatar
kopecky.filip:

Když je proměnná použita uvnitř nonymní funkce, tak se musí udržovat i potom, co vlákno opustí daný blok kódu.

Nahoru Odpovědět  +1 28.1.2015 11:44
Není důležité, kdo má pravdu, ale že se ví, jaká je. -já
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.