Estou tentando alterar uma lista no haskell para incluir 0 entre cada elemento. Se tivermos uma lista inicial [1..20]
, gostaria de alterá-la para[1,0,2,0,3..20]
O que eu pensei em fazer é realmente usar o mapa em todas as funções, extrair o elemento e adicioná-lo à lista e usá ++[0]
-lo, mas não tenho certeza se essa é a abordagem correta ou não. Ainda aprendendo haskell, pode haver erros.
Meu código:
x = map classify[1..20]
classify :: Int -> Int
addingFunction 0 [Int]
addingFunction :: Int -> [a] -> [a]
addingFunction x xs = [a] ++ x ++ xs
Você não pode fazer isso com
map
. Uma das propriedades fundamentais demap
é que sua saída sempre terá exatamente tantos itens quanto sua entrada, porque cada elemento de saída corresponde a uma entrada e vice-versa.Existe uma ferramenta relacionada com a energia necessária, no entanto:
Dessa forma, cada item de entrada pode produzir zero ou mais itens de saída. Você pode usar isso para criar a função desejada:
Ou uma definição mais concisa de
between
:fonte
Com uma correspondência simples de padrões, deve ser:
fonte
Se você deseja usar
map
para resolver isso, pode fazer algo assim:Tem uma função que obtém uma lista int e retorna 2 elementos com int e zero:
Então você pode chamar o mapa com esta função:
Você notará que é uma lista aninhada. É assim que
map
funciona. Precisamos de uma maneira de combinar a lista interna em apenas uma lista. Neste caso, usamosfoldl
Portanto, a maneira como foldl funciona nesse caso é que ele aceita uma função de combinação, valor inicial e a lista a combinar.
Como não precisamos do primeiro 0, podemos eliminá-lo:
Código final:
fonte
foldl (++) []
é um pouco estranho. Por que não apenas apontarconcat
?concat
própria implementação também usa algum tipo defold
. Então, acho que usarfoldl
ajudaria outros a entender um pouco mais a fundo.concat
é implementado usando emfoldr
vez defoldl
. Você entende por que isso é realmente importante?fold
mim mesmo. Existe um wiki inteiro relacionado a esse assunto. Meu entendimento simples é quefoldr
é muito melhor para lista infinita lenta efoldl
oufoldl'
(versão estrita) é melhor para caso de uso geral.Aqui, podemos usar um
foldr
padrão em que, para cada elemento da lista original, o anexamos com um0
:fonte
Se você não quiser usar
intersperse
, pode escrever o seu.Se desejar, você pode usar as
Applicative
operações:Esta é basicamente a definição usada em
Data.Sequence
.fonte