Hogyan tudnám javítani a haskell kódomat?
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"]
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
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 ?
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
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
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!