Az Elm programozási nyelv

Funkcionális reaktív programozás

Bevezető

A Funckionális Reaktív Programozás (FRP) segítségével tiszta, időtől függő függvényekkel tudunk interaktív programokat leírni. Ez a paradigma először 1997-ben jelent meg, amit kezdetben animációk leírására használtak.

Ennek a paradigmának több válfaja is létezik, a klasszikus FRP-ben folyamatosan változó értékeket (Behavior) és adott időpontban kiváltódó eseményeket (Event) különböztetünk meg. Az Elm nyelv az egyszerűségre törekszik, így itt csak jeleket (Signal) használnuk minden időben változó érték leírására.

Jelek

Az interakciók leírásának alapja a jelek (Signal), amik időben változó értékek. Példa:

Mouse.position : Signal (Int,Int) -- jel az aktuális egérpozícióra Mouse.clicks : Signal () -- egy jel, ami minden egérkattintáskor kiváltódik

Saját jeleket nem tudunk definiálni, csak a beépítetteket módosítani, mivel ezeknek a jeleknek az értékeit a JavaScript adja. Célunk így az, hogy ezeket a jeleket egy kirajzolható jellé módosítsuk, amit aztán a main függvényünknek értékül adhatunk.

Lift

A lift függvény segítségével tiszta függvényekkel tudunk jeleket módosítani, első paramétere egy jel értékét paraméterül kapó függvény, ami így egy új jelet hoz létre.

lift : (a -> b) -> Signal a -> Signal b lift2 : (a -> b -> c) -> Signal a -> Signal b -> Signal c ...

Ennek egy szebb leírására két infix operátor is használható, a (<~) és (~), amiknek a működése megegyezik a lift-ével.

lift2 scene Window.dimensions Mouse.position scene <~ Window.dimensions ~ Mouse.position

Ennek segítségével ez a példaprogram az egér aktuális pozíciójára kirajzol egy négyzetet:

main = scene <~ Window.dimensions ~ Mouse.position scene (w,h) (x,y) = let (dx,dy) = (toFloat x - toFloat w / 2, toFloat h / 2 - toFloat y) in collage w h [ rect 10 10 |> filled orange |> move (dx, dy) ]

Main függvény

Interaktív programunkban a main függvények Signal Element a típusa, azaz egy időben változó grakius elem jele. Ebben a példában a szöveg elementre konvertáló asText függvénnyel módosítjuk az egérpozíció jelét és így egy kirajzolható elemet kapunk:

main = lift asText Mouse.position

Hivatkozások

Az FRP és Elm kapcsolatának bővebb leírása.

Példaprogramok.