Kezdőoldal » Számítástechnika » Programozás » Hogyan tudnám javítani a...

Hogyan tudnám javítani a haskell kódomat?

Figyelt kérdés

Az utolsó két tesztesetre működik, viszont a hosszabb listára nem jó a kód, de nem sikerül rájönni mi a hiba.Valaki tudna segíteni javítani ?


swapElems :: [[a]] -> [[a]]

swapElems [] = []

swapElems [x:y:xs] = [y : x :xs]

swapElems (x:y:xs) = (y:x) : swapElems xs // itt a hiba


Tesztek:

swapElems ["egy", "ketto", "harom"] == ["gey","ektto","ahrom"]

swapElems [] == []

swapElems ["alma"] == ["lama"]



2022. márc. 8. 15:59
 1/3 anonim ***** válasza:

ezzel több gond is van


ez például biztosan hibás: (y:x)

az y és az x típusa "[a]", tehát az y:x gyakorlatilag azt jelenti, hogy egy listát akarsz beletenni egy másik listába, de ez így hibás, mivel egy "[a]" típusú listába csak "a" típusú elemeket lehet beletenni, és az y típusa pedig "[a]"

ez akkor lenne helyes, ha y típusa "[a]" lenne, x típusa "[[a]]"

vagy ha y típusa "a" lenne, x típusa "[a]"

de ha ezt megpróbálod lefordítani, akkor pontosan megkapod ezt a hibaüzenetet

ha az y:x körül leveszed a zárójelet, akkor jó lehet

viszont így se azt csinálod, mint ami a feladat


a feladat az, hogy a lista minden elemének az első két elemét cseréld meg

amit leírtál, az pedig arra hasonlít, hogy a lista minden második elemét megcseréled a következővel

az első eset, amit felírtál (swapElems [] = []) az jó, az üres listát külön kell vizsgálni

a következő (swapElems [x:y:xs] = [y : x :xs]) viszont felesleges, ezzel az egy elemű listát vizsgálod, ez nem kell, hogy külön eset legyen

a harmadik (swapElems (x:y:xs) = ...) pedig teljesen rossz, ezt írd újra

azt kell csinálni, hogy a lista első elemét kiveszed, megcseréled benne az első két elemet, és utána jöhet a rekurzív függvényhívás a lista többi részére

amikor a függvénynek paraméterként átadott listára illesztesz mintát, akkor azt vedd figyelembe, hogy annak az elemei szintén listák, és ezekre a listákra ismét mintát kell ileszteni, ha meg akarod cserélni az elemeket

2022. márc. 8. 18:06
Hasznos számodra ez a válasz?
 2/3 A kérdező kommentje:

Köszönöm szépen a segítséget, mostmár látom hogy tényleg az első két elemet cseréli meg. Viszont akkor ha a listában a listára akarok mintát illeszteni bele kell raknom még egy zárójelbe vagy meg kell dupláznom ?

pl: ((x:y:xs)) - Így az x lenne a [[alma]] x = a,y = l, xs= ma, vagy ennek az ábrázolására valami másik módszert kellene keresnem ?

2022. márc. 8. 19:32
 3/3 anonim ***** válasza:

ezzel tudsz mintát illeszteni a lista első elemére, tehát itt l is egy lista: swapElems (l:ls) = ...


ha még l elemeire is mintát akarsz illeszteni, akkor azt így szerintem meg tudod csinálni: swapElems ((x:y:s):ls)

itt kell megcserélni x-et és y-t

viszont ez a megoldás feltételezi, hogy a belső listákban van legalább 2 elem, de ha ezt nem tehetjük fel, akkor újabb minta kell, ami lefedi azt az esetet is, amikor a belső lista kevesebb, mint 2 elemet tartalmaz (ilyenkor nyilván nem kell semmit csinálni vele)


ennél egyszerűbb megoldást kapsz, ha írsz egy segédfüggvényt, ami azt csinálja, hogy egy lista (tehát [a] típusú lista) első két elemét megcseréli (ügyelve arra az esetre is, amikor kevesebb, mint 2 elem van)

és ezt a segédfüggvényt kell csak alkalmazni a swapElems paramétereként kapott listára (pl. map-pel, vagy elemenként, rekurzívan)


persze meg lehet oldani segédfüggvény nélkül is, például where és case-of segítségével

ha érdekel ez a megoldás (és már sikerült valami más módszerrel megoldanod a feladatot), akkor szólj, és elküldöm

2022. márc. 8. 20:08
Hasznos számodra ez a válasz?

Kapcsolódó kérdések:




Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!