Diskuze: Fsharp události

Člen

Zobrazeno 9 zpráv z 9.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
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.
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
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.
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
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.
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
Mimochodem, co myslíš tím, že "mutable proměnná se nedá capturnout?"
Když je proměnná použita uvnitř nonymní funkce, tak se musí udržovat i potom, co vlákno opustí daný blok kódu.
Zobrazeno 9 zpráv z 9.