1
votes

Diviser une chaîne par un caractère choisi dans haskell

J'essaye de diviser une chaîne à chaque fois qu'il y a un caractère choisi. Donc, si je reçois "1,2,3,4,5" , et que mon caractère choisi est "," le résultat est une liste telle que [" 1 "," 2 "," 3 "," 4 "," 5 "] .

J'ai parcouru les questions déjà répondues ici et elles m'indiquent d'utiliser splitOn . Cependant, lorsque j'essaie d ' importer Data.List.Split pour l'utiliser, Haskell me donne l'erreur suivante: Impossible de trouver le module "Data.List.Split" . Lorsque j'ai essayé d'utiliser simplement splitOn sans importer le module, cela m'a montré Variable hors de portée: splitOn .

Mes questions sont donc,

  1. Est-ce normal que j'obtienne cette erreur? splitOn est-il une option viable ou devrais-je simplement essayer autre chose?
  2. Quelles autres solutions simples existe-t-il?

Je peux simplement écrire quelque chose qui fera cela pour moi, mais je me demande pourquoi je ne peux pas importer Data.List.Split et s'il existe d'autres options plus simples que je je ne vois pas. Merci!


0 commentaires

3 Réponses :


1
votes

‘Data.List.Split’ n’est pas en prélude et doit être installé en tant que package de dépendances. La commande d'installation dépend de l'environnement que vous utilisez: «Stack install split» pour la pile «Cabal install split» pour cabal


0 commentaires

2
votes

Si vous utilisez GHC , il est fourni avec le Prelude standard et les modules du package de base , et peut-être quelques autres packages.

La plupart des packages, comme split package (qui contient le module Data.List.Split ), aren ne fait pas partie de GHC lui-même. Vous devrez les importer en tant qu'étape de compilation explicite. Cela se fait plus facilement avec un outil de construction. La plupart des Haskellers utilisent Cabal ou Stack .

Avec Stack, par exemple, vous pouvez ajouter le package split à votre package.yaml code> fichier:

dependencies:
- base >= 4.7 && < 5
- split

Vous pouvez également charger un package supplémentaire lorsque vous utilisez Stack pour démarrer GHCi . Ceci est utile pour les expériences ad hoc.


0 commentaires

1
votes

En gros, il s'agit d'une tâche foldr . Donc, vous pouvez simplement faire comme

λ> splitOn (',') . dropAround (==',') $ ",1,2,3,42,5,"
["1","2","3","42","5"]

Donc;

dropAround :: (Char -> Bool) -> String -> String
dropAround b = dropWhile b . dropWhileEnd b

λ> dropAround (==',') ",1,2,3,42,5,"
"1,2,3,42,5"

Cependant, cela nous donnera des résultats raisonnables mais peut-être pas souhaités tels que; p>

λ> splitOn ',' ",1,2,3,42,5,"
["","1","2","3","42","5",""]

Dans ce cas particulier, il peut être intéressant de couper les caractères indésirables de la chaîne à l'avance. Dans Haskell cependant, cette fonctionnalité, je suppose, porte généralement le nom

splitOn x = foldr (\c (s:ss) -> if c == x then "":s:ss else (c:s):ss) [""]

en conséquence;

λ> foldr (\c (s:ss) -> if c == ',' then "":s:ss else (c:s):ss) [""] "1,2,3,42,5"
["1","2","3","42","5"]


0 commentaires