在路径字符串上将'\\'更改为'/'

Cim*_*aio 1 haskell

我试图从给定的路径读取和写入文件。问题是,当我从文件(在Windows上为Im)复制路径时,它使用'\'作为路径分隔符,但haskell似乎无法理解它,因为例如:“ aDir \ file.txt”错误地读取了'\ f'是无效字符。

这就是为什么我试图创建一个函数来将该路径“标准化”(转换)为一个以“ /”作为路径分隔符的函数(它可以正常工作)的原因,但是我想,由于同样的原因,它不起作用。有没有内置的功能已经为我做到了?

main :: String -> (String -> String) -> IO ()
main path transformation = do
    let normalizedPath = normalizePath path
    contenido <- readFile normalizedPath
    let resultado = transformation contenido
    writeFile normalizedPath resultado

normalizePath :: String -> String
normalizePath = map f 
    where
        f '\\' = '/'
Run Code Online (Sandbox Code Playgroud)

Wil*_*sem 6

我认为您使事情变得更加复杂。您可以在map此处使用一个:

normalizePath :: String -> String
normalizePath = map f
    where f '\\' = '/'
          f x = x
Run Code Online (Sandbox Code Playgroud)

因此,我们在这里将所有'\\'字符转换为'/'字符。

请注意,字符串"aDir\file.txt"没有包含反斜杠,因为它分析了'\f',这是一个进纸符。如果字符串包含反斜杠,则作为字符串文字,其格式应为"aDir\\file.txt"

例如:

Prelude> normalizePath "aDir\\file.txt"
"aDir/file.txt"
Run Code Online (Sandbox Code Playgroud)

您可以通过[Hackage]包输入原始字符串。例如:raw-strings-qq

$ ghci -XQuasiQuotes 
GHCi, version 8.0.2: http://www.haskell.org/ghc/  :? for help
Prelude> :{
Prelude| normalizePath :: String -> String
Prelude| normalizePath = map f
Prelude|     where f '\\' = '/'
Prelude|           f x = x
Prelude| :}
Prelude> import Text.RawString.QQ
Prelude Text.RawString.QQ> normalizePath [r|C:\Users\admin\Desktop\file.txt|]
"C:/Users/admin/Desktop/file.txt"
Run Code Online (Sandbox Code Playgroud)

  • @CimimUxMaio:原因是““ C:\ Users \ admin \ Desktop \ file.txt”不是有效的字符串,而且是文字,\ U不正确。如果要在字符串中使用反斜杠,则需要对其进行转义,例如`“ C:\\ Users \\ admin \\ Desktop \\ file.txt”` (2认同)