Kurzusok
/
Roc
Roc
/
Feladatok
/
Listaműveletek
Listaműveletek

Listaműveletek

Közepes

Utasítások

Valósítsd meg az alapvető listaműveleteket.

Funkcionális nyelvekben az olyan listaműveletek, mint a length, a map és a reduce, nagyon gyakoriak. Valósíts meg egy sor alapvető listaműveletet anélkül, hogy meglévő függvényeket használnál.

A megvalósítandó műveletek pontos száma és neve kurzustól függ, hogy elkerüljük a meglévő nevekkel való ütközést, de az általad megvalósítandó általános műveletek közé tartoznak:

  • append (adott két lista, a második lista összes elemét fűzd az első lista végéhez);
  • concatenate (adott egy sor lista, az összes lista minden elemét fűzd össze egyetlen lapos listává);
  • filter (adott egy predikátum és egy lista, add vissza mindazon elemek listáját, amelyekre predicate(item) igaz);
  • length (adott egy lista, add vissza a benne lévő elemek teljes számát);
  • map (adott egy függvény és egy lista, add vissza azoknak az eredményeknek a listáját, amelyeket úgy kapsz, hogy minden elemre alkalmazod a function(item)-et);
  • foldl (adott egy függvény, egy lista és egy kezdő akkumulátor, hajtsd (redukáld) az egyes elemeket balról az akkumulátorba);
  • foldr (adott egy függvény, egy lista és egy kezdő akkumulátor, hajtsd (redukáld) az egyes elemeket jobbról az akkumulátorba);
  • reverse (adott egy lista, add vissza egy listát az összes eredeti elemmel, de fordított sorrendben).

Figyelj rá, hogy a fold függvényeknek (foldl, foldr) átadott argumentumok sorrendje nem mindegy.

Várjunk csak, ez lehetetlen!

Ezeknek a listaműveleteknek a megvalósítása bármilyen beépített függvény használata nélkül gyakorlatilag lehetetlen Roc-ban, mert szükséged van egy módra, amivel elemeket fűzhetsz a lista végére vagy elejére. Más nyelvekben használhatsz operátorokat, például a :-t Haskellben vagy a +=-t Pythonban, de Roc-ban a List függvényeket kell használnod.

Tehát ebben a feladatban használhatod a List.append-et (de kerüld bármely más beépített függvény használatát).

Sok funkcionális programozási nyelv elsődleges gyűjteménytípusként láncolt listákat használ. Láncolt listánál hatékony egy elemet elé fűzni vagy kivenni az első elemet, ezért azokban a nyelvekben a List.prepend használatával valósítanád meg a listaműveleteket. Roc-ban viszont a List egy tömb (összefüggő bájtokból álló blokk). A tömbök más tulajdonságokkal rendelkeznek, mint a láncolt listák, például hatékonyan el lehet érni az elemeket index alapján, és új elemeket lehet hozzáfűzni. Emiatt Roc-ban gyakran használjuk a List.append-et, és ritkán a List.prepend-et.

Elnevezések

A Roc némileg eltérő neveket használ, mint az általános utasításokban szereplők:

  • concat az append helyett
  • join a concatenate helyett
  • len a length helyett
  • fold a foldl helyett
  • fold_rev a foldr helyett

Roc-ban azonban a következő függvénynevek szabványosak:

  • filter
  • map
  • reverse

Tipp

Próbáld ki a következőt:

match list {
    [] => ...
    [first, .. as rest] => ...
}

vagy

match list {
    [] => ...
    [.. as rest, last] => ...
}
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Roc Exercism

Készen állsz elkezdeni a(z) Listaműveletek feladatot?

Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Roc nyelvet 120 feladat segítségével, valódi emberi mentorálással, mindez ingyen.

Mélyelemzés: Listaműveletek!

Élvezd a rekurzió gyakorlati bevezetését, fedezd fel a List Ops imperatív és funkcionális alternatíváit, és merülj el a farokhívásos rekurzióban és az akkumulátorfüggvényekben.