Je suis nouveau à Haskell et je recherche des fonctions standard pour travailler avec des listes par index.
Mon problème exact est que je veux supprimer 3 éléments après chaque 5. Si ce n'est pas assez clair ici, il est d'illustration: p> Je sais écrire une énorme fonction avec De nombreux paramètres, mais y a-t-il un moyen intelligent de faire cela? p> p>
8 Réponses :
Vous pouvez compter facilement vos éléments:
strip (a:b:c:d:e:_:_:_:xs) = a:b:c:d:e:strip xs strip (a:b:c:d:e:xs) = a:b:c:d:e:[] strip xs = xs
J'aime la deuxième version, mais ce n'est pas généralisciabe. Ce qui est malheureux, car il est peut-être la solution la plus claire ici.
J'aime la solution de correspondance de modèle. Simple comme cela peut être possible. Bien que vous ayez besoin d'autres pour correspondre à des listes de moins de huit éléments. Ne peut jamais se rappeler comment cela fonctionne.
Voici ma solution: exemple: p>
Le prend code> et
Drop code> Les fonctions peuvent être capables de vous aider ici.
takeEveryNafterEveryM2 n m = splitReduce (takeNdropM 5 3)
Vous pouvez utiliser list.splitatat code>
avec goutte code>
: p>
nofm :: Int -> Int -> [a] -> [a] nofm n m = map snd . filter (\(i, _) -> i `mod` m < n) . zip [0..]
+1 Solution Deux est facilement généralisable à NOFM :: INT -> INT -> [A] -> [A] CODE> Prendre deux arguments à mettre à la place de 8 et 5, respectivement. Cela a également l'avantage d'être très clairement nommé.
C'est ma solution. C'est beaucoup comme @ Réponse de Barkmadley , en utilisant uniquement Je ne sais pas si ça va gagner des récompenses de vitesse ou d'intelligence, mais Je pense que c'est assez clair et concis, et cela fonctionne certainement: p> prendre code> et
goutte code>, mais avec moins d'encombrement à mon avis:
myRemove = map snd . filter fst . zip (cycle $ (replicate 5 True) ++ (replicate 3 False))
Puisque personne n'a fait une version avec "déroulée", voici ma prise:
drop3after5 lst = concat $ unfoldr chunk lst where chunk [] = Nothing chunk lst = Just (take 5 lst, drop (5+3) lst)
La fonction de concession est nécessaire au résultat final.
Voici ma prise:
deleteAt idx xs = lft ++ rgt where (lft, (_:rgt)) = splitAt idx xs
Oui,
g n m = carte prise m. M surmainement (pas.Null). Définissez (juste. Splithat (n + m)) Code> et l'appelez comme
g 3 5 "YÇON" code>. Import
data.list code> pour le
se déroule code>.