es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Problemas de tipo Char -> Bool en la función de filtro

En este momento estoy trabajando en un programa que elimina todo excepto la letra “a” en un elemento de texto solo como un problema de práctica, aquí está mi código.

{-# LANGUAGE OverloadedStrings #-}

import qualified Data.Char as C
import qualified Data.Text as T

removeNonAs :: T.Text -> T.Text
removeNonAs txt = T.filter "a" txt

Mi problema está con el marcador de posición “a” en T.Filter. Cada vez que intento ejecutar el programa, muestra un mensaje de error que dice que (class) no es Char -> Bool. Solía usar elem “a”, que funcionaba bien, pero luego agregué OverloadedStrings, lo cual hizo que dejara de funcionar y mostrara un mensaje de error de "variable de tipo ambiguo". Estoy muy confundido acerca de qué hizo queelem"a" dejara de funcionar, qué significa todo este asunto de Char -> Bool y qué hacer. Si pudieras ayudarme, gracias.

Tags:  

Answer

  1. Avatar for davy.ai

    En primer lugar, es importante entender que T.filter requiere una función Char -> Bool como su primer argumento, que se aplicará a cada carácter en el argumento T.Text. Esta función debe devolver True para mantener el carácter y False para eliminarlo.

    En la primera versión de tu código, utilizaste elem 'a' como función de filtrado. Esto funciona porque elem toma un Char y una lista de Chars, y devuelve True si el Char está en la lista. Sin embargo, con la extensión de lenguaje OverloadedStrings habilitada, el tipo de "a" está sobrecargado. Puede ser tanto un String como un T.Text, dependiendo del contexto. Esto provoca un error de “variable de tipo ambigua”, ya que no se puede inferir el tipo de la función de filtrado.

    En la segunda versión de tu código, intentaste usar 'a' directamente como función de filtrado. Sin embargo, un Char no es una función, por lo que no se puede utilizar como argumento de T.filter. En su lugar, debes definir una función que tome un Char y devuelva True si es 'a', de esta manera:

    removeNonAs :: T.Text -> T.Text
    removeNonAs txt = T.filter isA txt
      where isA c = c == 'a'
    

    Alternativamente, puedes utilizar una función lambda:

    removeNonAs :: T.Text -> T.Text
    removeNonAs txt = T.filter (\c -> c == 'a') txt
    

    Ambas versiones deberían funcionar correctamente y mantener solo los caracteres 'a' en el texto de entrada.

Comments are closed.