Plegable con funciones anónimas

0

Pregunta

Actualmente estoy tratando de aprender a doblar.

Pero en lugar de utilizar funciones predefinidas quiero utilizar mi cuenta.

Así que me quiero hacer doble todas las vocales en una Cadena.

doubleVowels :: String -> String

Mi intento es (de momento sólo para 'a', como yo voy a tratar de resolverlo de una carta primera y la voluntad de ampliar y optimizar la página, una vez que se ejecuta):

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

Tratando de que se ejecute el código me da el siguiente 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

Mejor respuesta

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

En la mayoría de los casos, si no hay una razón específica para foldl, uso foldr en lugar de foldl ya que permite que el compilador de Haskell para perezosamente evaluar su expresión. Si recuerdo correctamente, incluso, a continuación, utilizar foldl'desde foldl no es estricta y toma demasiada memoria mientras no te da ningún beneficio para la pereza.

Aparte de eso, le falta el segundo argumento foldrs (o foldls) de la función. foldr tipo:

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

La función foldr tiene el tipo a -> b -> b donde el primer argumento es el elemento actual de la estructura plegable, y el segundo es el acumulador. La lambda de que está utilizando tiene un solo parámetro.

Además, el cuerpo de la función lambda también no tiene mucho sentido.

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

a es el parámetro que los alrededores de la función doubleVowels recibe. Usted necesidad de utilizar los parámetros de la función lambda aquí.

2021-11-20 04:24:46
4

Primero de todo, la función que se utiliza en foldl debe tener dos argments. La primera es la accmulated resultado, y la otra es la actual char. Segundo, el orden de evaluación de foldl es de izquierda a derecha, por lo que tenemos que reverse la cadena de resultado.

Por ejemplo, aquí es una versión 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

En otros idiomas

Esta página está en otros idiomas

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

Popular en esta categoría

Las preguntas más habituales en esta categoría