HTML

Survive Developement

Itt olvashatod a Survive! nevű játék fejlesztésének állapotát, lépéseit. És mi is lesz a játék? Egy zombis-túlélős játék, ahol elsősorban a csapatmunkára építkezve kell megpróbálni életben maradni egy kihalt városban. A terep teljesen a tietek, nincsenek szabályok: éljetek túl, ahogy tudtok!


Küldj e-mailt nekünk:
gilgamesco@gmail.com

Sikolyok

Ettől tépjük a hajunkat:

Friss topikok

  • Sir Butcher: A gyors mozgású ütközés-érzékelés majd a lövésnél lesz topic :D A második esetben teljesen igaza... (2012.04.05. 16:38) Ütközésérzékelés
  • _fpeti_: Halad ez. (2012.04.04. 22:01) Gravitáció
  • Sir Butcher: Az sem rossz, az tény :D Szerencsére egyelőre annyi különbözőt kell csinálnom, hogy esélyem sincs ... (2012.02.20. 21:48) Scenery - Még több látvány
  • Sir Butcher: Na, ideírom: obj-nél megoldottam a csontokat. Melléktermékként összejöttek, extra számítás nélkül ... (2011.12.02. 11:48) Model Animálás - a probléma, és a (vélt) megoldás
  • Burwor: "A tesztvárosban sétálgatva belefutsz egy házba, aminek hiányzik egy fala. Mit csinálsz?" Zárva a... (2011.11.10. 15:00) Sziduri - a grafmotor bemutatkozik

Variációk egy témára

2011.09.14. 06:40 :: GizmoSDK

Ahogy tanulgatom a monádikus kódok írását, azt veszem észre, hogy a Haskell nyelv rengeteg stílust megenged. Vegyünk egy példát: van egy Graph osztályunk, amiben van két lista, illetve két egész szám, amik meghatározzák, hogy a kövektkezőnek gráfhoz adandó élnek vagy pontnak mi lesz az indexe (ami után - ugyebár - meg kell növelni ezt az értéket eggyel). (Persze ez nem a leghatékonyabb, mert pl. törlésnél keletkeznek felhasználatlan indexek is, de most a példánál erre nem lesz szükségünk.) Az első lista minden eleme egy pár, aminek az első része egy gráfpont, a második pedig egy index (egész szám). A második lista is ugyanígy néz ki, csak a párok első eleme nem gráfpont, hanem gráfél. Minden gráfpontnak van egy pozíciója, és tartalmazza az összes belőle kiinduló él sorszámát. Az élek pedig tudják magukról, hogy kik a végpontjaik (tartalmazzák az indexüket).

A feladat: írjunk egy olyan függvényt, ami hozzáad egy pontot a gráfhoz (tehát fogja a pontot, hozzárendel egy indexet, a pontból és az indexből képez egy párt, majd kreál egy új gráfot, ami megegyezik a régi gráffal azt leszámítva, hogy az új gráf gráfpontokat tartalmazó listájában már benne van az új pont. Ja igen, ha Haskellben egy változót deklaráltál, az már úgy marad a program bezárásáig. Ezért is "pure" nyelv. Ezt úgy kerüljük ki, hogy létrehozunk egy új változót, és azt adjuk vissza. (Erre van az a vicc is, hogy ha a Haskell egy kocsi lenne, az úgy működne, hogy igazából nem is megy sehova, hanem végig másolatokat készít magáról az út mentén :D)).

A típusszignatúra a következő lesz:

addNode :: Node -> State Graph ()

Tehát az előző posztból ismerős State monádot fogjuk - kicsikét szelídebb célokra - használni. No hát akkor nézzük, hogy is nézne ki a kód do-jelölést használva:

addNode :: Node -> State Graph ()
addNode n = do
  Graph nl el nni nei <- get
  put (Graph ((n, nni):nl) el (nni + 1) nei)

Tehát először is kicsomagoljuk a gráfot, majd visszaadunk egy másikat, amiben már benne van az új pont. Jó tömören van megírva, nem fontos megérteni, csak a stílust kell figyelni. Na de a do-jelölés káros a kezdők számára, mert így könnyen megtéveszti az imperatív háttérrel rendelkező tanulókat, és rosszul fogják felhasználni, aztán csak tépik a hajukat, hogy mi van. Tehát írjuk meg anélkül.

Először is, használhatunk lambda függvényeket (tehát névtelen függvényeket), amikkel így nézne ki a kód:

addNode :: Node -> State Graph ()
addNode n =
  get >>= \(Graph nl el nni nei) ->
  put (Graph ((n, nni):nl) el (nni + 1) nei)

Aztán, valaki jobban szeret megmaradni a matematikai formuláknál, azoknak van kitalálva a let..in forma (az f (Graph...) rész nem fért ki egy sorba, ezért tördeltem):

addNode :: Node -> State Graph ()
addNode n =
  let
    f (Graph nl el nni nei) =
      put (Graph ((n, nni):nl) el (nni + 1) nei)
  in
    get >>= f

Valaki viszont a matematika másik formáját szereti, amit még Iózanparasztiész görög matematikus-filozófus alkotott meg, és ami előnyben részesíti a definíciót, és csak utána a magyarázatot, tehát a "where" kulcsszót használja (szintén tördelve):

addNode :: Node -> State Graph ()
addNode n =
    get >>= f
  where
    f (Graph nl el nni nei) =
      put (Graph ((n, nni):nl) el (nni + 1) nei)

És akkor persze ez csak a State monád. Egyébként a do-jelölésnek megvan az az előnye, hogy hamarabb el lehet kezdeni működő kódot írni, mint hogy valaki teljesen megértené a monádok működését, ami számomra nagy előny, mert már így is késésben vagyok ezzel a nyamvadék városgennel. (Igen, ma van a határidő. Hát, vicces... >.<) De közben gyakorolgatok, különböző formákba írom át, meg vissza, hogy azért haladjak a megértéssel is. Jó móka :D

Szólj hozzá!

Címkék: state haskell monád

A bejegyzés trackback címe:

https://survivedev.blog.hu/api/trackback/id/tr693225953

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása