我试图从给定的路径读取和写入文件。问题是,当我从文件(在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)
我认为您使事情变得更加复杂。您可以在map此处使用一个:
normalizePath :: String -> String
normalizePath = map f
where f '\\' = '/'
f x = xRun 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)