Existe uma maneira padrão de dividir uma string em Haskell?
lines
e words
funciona muito bem ao dividir em um espaço ou nova linha, mas certamente existe uma maneira padrão de dividir em uma vírgula?
Não encontrei no Hoogle.
Para ser específico, estou procurando algo em que split "," "my,comma,separated,list"
retorne ["my","comma","separated","list"]
.
Data.List
ou até mesmoPrelude
. É tão comum e desagradável se não estiver disponível para o código-golfe.Respostas:
Há um pacote para esse chamado split .
Use-o assim:
Ele vem com muitas outras funções para dividir em delimitadores correspondentes ou ter vários delimitadores.
fonte
split
função que atenda a todas as necessidades, você realmente precisa desse tipo de pacote.split
àbuild-depends
lista no seu arquivo cabal, por exemplo, se o seu projeto for chamado hello, nohello.cabal
arquivo abaixo daexecutable hello
linha coloque uma linha como `build-depende: base, divisão` (observe o recuo de dois espaços). Em seguida, construa usando ocabal build
comando Cf. haskell.org/cabal/users-guide/...Lembre-se de que você pode procurar a definição de funções do Prelude!
http://www.haskell.org/onlinereport/standard-prelude.html
Olhando para lá, a definição de
words
é,Portanto, altere-o para uma função que aceita um predicado:
Em seguida, chame-o com o predicado que você quiser!
fonte
Se você usar Data.Text, haverá splitOn:
http://hackage.haskell.org/packages/archive/text/0.11.2.0/doc/html/Data-Text.html#v:splitOn
Isso é construído na plataforma Haskell.
Então, por exemplo:
ou:
fonte
text
pacote ou instalá-lo. Mas pertenceria a outra pergunta.No módulo Text.Regex (parte da plataforma Haskell), existe uma função:
que divide uma string com base em uma expressão regular. A API pode ser encontrada em Hackage .
fonte
Could not find module ‘Text.Regex’ Perhaps you meant Text.Read (from base-4.10.1.0)
Use
Data.List.Split
, que usasplit
:fonte
Tente este:
Funciona apenas para um único caractere, mas deve ser facilmente extensível.
fonte
Sem importar nada, uma substituição direta de um caractere por um espaço, o separador de destino para
words
é um espaço. Algo como:ou
Você pode transformar isso em uma função com parâmetros. Você pode eliminar o parâmetro caractere para corresponder à minha correspondência, como em:
fonte
Por exemplo
Um único delimitador à direita será eliminado:
fonte
Comecei a aprender Haskell ontem, então me corrija se estiver errado, mas:
dá:
ou talvez você quisesse
qual seria:
fonte
split
, sendo mimado por idiomas com bibliotecas bem desenvolvidas. Mas obrigada mesmo assim.Eu não sei como adicionar um comentário sobre a resposta de Steve, mas eu gostaria de recomendar a
documentação GHC bibliotecas ,
e em lá especificamente as
funções de sub-lista em Data.List
O que é muito melhor como referência do que apenas ler o relatório simples de Haskell.
Geralmente, uma dobra com uma regra sobre quando criar uma nova sublist para alimentar, também deve resolvê-la.
fonte
Além das funções eficientes e pré-criadas fornecidas nas respostas, adicionarei as minhas, que são simplesmente parte do meu repertório de funções Haskell que eu estava escrevendo para aprender o idioma em meu próprio tempo:
As soluções são pelo menos recursivas de cauda, para que não ocorram um estouro de pilha.
fonte
Exemplo no ghci:
fonte
ghci
?Acho isso mais simples de entender:
fonte