Variable mutable que obtiene el valor de un archivo en Haskell.
En un archivo estoy guardando una ruta de archivo. Quiero leer la ruta de archivo desde el archivo y luego convertirla en una variable, para que cada vez que ejecute una función obtenga la ruta de archivo actual desde el archivo y luego pueda usar esta cadena en otra función. Sé que las variables son inmutables, pero ¿hay alguna manera de hacerlo?
Aquí, como puedes ver, estoy tratando de leer la ruta de archivo desde el archivo y luego verificar si es correcta:
checksForCdCommand dir = checkIfPathExists constructedPath $ concat' $ paths sample2 where
constructedPath = do
let file = "abc.txt"
contents <- readFile file
return (if contents /= "/" then contents ++ "/" ++ dir else contents ++ dir)
Aquí si el contenido es “/”, significa que es mi directorio raíz, por eso tengo esta cláusula if else.
Pero de esta manera el código no se compila debido a lo siguiente:
none
* No se pudo hacer coincidir el tipo `[Char]'
con el tipo `IO [Char]'
* En el primer argumento de `checkIfPathExists', a saber
`constructedPath'
En la expresión: checkIfPathExists constructedPath
En la expresión:
checkIfPathExists constructedPath $ concat' $ paths sample2
Quiero hacer algo como esto:
checksForCdCommand dir = checkIfPathExists constructedPath $ concat' $ paths sample2 where
constructedPath = if currDir /= "/" then currDir ++ "/" ++ dir else currDir ++ dir
donde currDir
siempre tiene el valor del archivo.
La idea es que tengo un árbol que representa un sistema de archivos y con la función paths
obtengo todas las rutas a los hijos, con checkIfPathExists
paso una cadena como argumento para ver si es parte de todas las rutas y estoy haciendo un comando que es como el comando cd de Unix y cuando cambio de directorio guardo el directorio actual en el archivo.
Necesito este directorio actual para otras cosas y por eso necesito leerlo desde un archivo y luego cambiar la variable currDir
para poder usarlo en otras funciones.
davy.ai
Para convertir una cadena de texto de un archivo a una variable, primero debes utilizar la función
readFile
para leer el contenido del archivo y almacenarlo en un IO String. Sin embargo, debido a que las acciones IO no pueden ejecutarse dentro de una función pura, necesitas utilizar la funciónunsafePerformIO
para ejecutar la acción IO y devolver el valor de tipo String resultante.Aquí tienes un ejemplo de cómo convertir una cadena de texto con la ruta de un archivo a una variable:
Ten en cuenta que debes utilizar
unsafePerformIO
con precaución, ya que puede generar un comportamiento inesperado y dificultar el razonamiento sobre tu código. En general, es mejor trabajar directamente con acciones IO en lugar de intentar convertirlas en valores puros. En lugar de guardar el directorio actual en un archivo y leerlo nuevamente, podrías considerar el uso de una IORef o un monad de estado para gestionar el estado mutable dentro de tu programa.