Dobrável com funções anônimas

0

Pergunta

Atualmente estou tentando aprender a dobrar.

Mas em vez de usar funções pré-definidas que eu quero usar o meu próprio.

Então, eu quero o dobro de todas as vogais em uma Seqüência de caracteres.

doubleVowels :: String -> String

A minha tentativa é (ainda apenas para 'a', tal como estou a tentar resolvê-lo por uma letra primeiro e vai se expandir e otimizar a ele, uma vez que ele é executado):

doubleVowels :: String -> String
doubleVowels  a = foldl (\eachChar -> if eachChar == 'a' then (a ++ "aa") else a) "" a

Tentar executar o código que eu estou recebendo a seguinte erorr:

Experimenting.hs:8:78: error:
    * Couldn't match type `[Char]' with `Char -> Char'
      Expected type: Char -> Char
        Actual type: String
    * In the expression: a
      In the expression: if eachChar == 'a' then (a ++ "aa") else a
      In the first argument of `foldl', namely
        `(\ eachChar -> if eachChar == 'a' then (a ++ "aa") else a)'
  |
8 | doubleVowels a = foldl (\eachChar -> if eachChar == 'a' then (a ++ "aa") else a) "" a
  |                                                                              ^

Experimenting.hs:8:81: error:
    * Couldn't match expected type `Char' with actual type `[Char]'
    * In the second argument of `foldl', namely `""'
      In the expression:
        foldl
          (\ eachChar -> if eachChar == 'a' then (a ++ "aa") else a) "" a
      In an equation for `doubleVowels':
          doubleVowels
            = foldl
                (\ eachChar -> if eachChar == 'a' then (a ++ "aa") else a) "" a
  |
8 | doubleVowels a = foldl (\eachChar -> if eachChar == 'a' then (a ++ "aa") else a) "" a
  |                                                                                 ^^
Failed, no modules loaded.

2

Melhor resposta

4
doubleVowels :: String -> String
doubleVowels  a = foldr (\eachChar b -> if eachChar == 'a' then ("aa" ++ b) else (eachChar:b)) "" a

Na maioria dos casos, se não há nenhuma razão específica para foldl, uso foldr em vez de foldl como ele permite que o compilador Haskell para preguiçosamente avaliar a sua expressão. Se eu me lembro corretamente, mesmo depois de usar foldl', já que foldl não é rigorosa e exige muito da memória, enquanto não lhe dando qualquer benefício para a preguiça.

Além do que, você está perdendo o segundo argumento para foldrs (ou foldls) função. foldr tem o tipo:

foldr :: (a -> b -> b) -> b -> t a -> b

A função para foldr tem tipo a -> b -> b onde o primeiro argumento é o elemento atual da dobradura estrutura e o segundo é o acumulador. Lambda que você está usando tem apenas um parâmetro.

Além disso, o corpo da função lambda também não faz muito sentido.

if eachChar == 'a' then (a ++ "aa") else a)

a é o parâmetro que a função em volta doubleVowels recebe. Você precisa usar os parâmetros da função lambda aqui.

2021-11-20 04:24:46
4

Primeiro de tudo, a função utilizada no foldl deve ter duas argments. O primeiro é o accmulated resultado, e o outro é o atual char. Segundo, a ordem de avaliação dos foldl é da esquerda para a direita, então temos que reverse o resultado de seqüência de caracteres.

Por exemplo, aqui está uma versão modificada

 doubleVowels :: String -> String
 doubleVowels s = reverse $ foldl (\x y -> if y == 'a' then ("aa" ++ x) else (y : x)) "" s
2021-11-20 04:13:13

Em outros idiomas

Esta página está em outros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

Popular nesta categoria

Perguntas populares nesta categoria