Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 改变'\\';至'/';关于路径字符串_Haskell - Fatal编程技术网

Haskell 改变'\\';至'/';关于路径字符串

Haskell 改变'\\';至'/';关于路径字符串,haskell,Haskell,我试图从给定的路径读写文件。问题是,当我从文件(Windows上的Im)复制路径时,它使用“\”作为路径分隔符,但haskell似乎不理解它,因为例如:“aDir\file.txt”错误地读取了无效字符“\f” 这就是为什么我试图创建一个函数,将这些路径“规范化”(转换)为一个以“/”作为路径分隔符的路径(这很好),但我认为它不起作用,因为同样的原因。 是否有任何内置函数已经为我实现了这一点 main :: String -> (String -> String) -> IO

我试图从给定的路径读写文件。问题是,当我从文件(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 '\\' = '/'
main::String->(String->String)->IO()
主路径转换=do
设normalizedPath=normalizePath路径
孔戴弦
normalizePath=map f
哪里
f'\\'='/'

我想你把事情弄得更复杂了。您只需在此处使用
地图

normalizePath :: String -> String
normalizePath = map f
    where f '\\' = '/'
          f x = x
因此,我们在此将所有
'\\'
字符转换为
'/'
字符

请注意,字符串
“aDir\file.txt”
不包含反斜杠,因为它是用
“\f”
解析的,这是一个换页字符。如果字符串包含反斜杠,则作为字符串文字,其格式为“aDir\\file.txt”

例如:

Prelude> normalizePath "aDir\\file.txt"
"aDir/file.txt"
$ 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"
您可以通过输入原始字符串。例如:

Prelude> normalizePath "aDir\\file.txt"
"aDir/file.txt"
$ 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"

我觉得你把事情弄得更复杂了。您只需在此处使用
地图

normalizePath :: String -> String
normalizePath = map f
    where f '\\' = '/'
          f x = x
因此,我们在此将所有
'\\'
字符转换为
'/'
字符

请注意,字符串
“aDir\file.txt”
不包含反斜杠,因为它是用
“\f”
解析的,这是一个换页字符。如果字符串包含反斜杠,则作为字符串文字,其格式为“aDir\\file.txt”

例如:

Prelude> normalizePath "aDir\\file.txt"
"aDir/file.txt"
$ 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"
您可以通过输入原始字符串。例如:

Prelude> normalizePath "aDir\\file.txt"
"aDir/file.txt"
$ 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"

我认为你一开始就不应该这样做。相反,当您将文件中的路径“复制”到源代码中时,只需在反斜杠前面添加一个额外的反斜杠来避免反斜杠。例如,不要把
fileName=“aDir\file.txt”
放在Haskell文件中,而是把
fileName=“aDir\\file.txt”
放在Haskell文件中。问题是我真正想要避免的正是这一点。因此,当我编写一个更复杂的程序时,它可以自动执行路径。当您编写一个更复杂的程序时,您将直接从文件中读取该程序,并且它将不受此转义限制。换句话说,如果您有一个配置文件,其中包含文本
aDir\file.txt
,并使用
readFile
将该文件读入
字符串
,则它将产生的
字符串
将与文本
aDir\\file.txt产生的
字符串
相同
。您不必定义
规范化路径
;改为使用
System.FilePath.normalize
。我认为您根本不应该这样做。相反,当您将文件中的路径“复制”到源代码中时,只需在反斜杠前面添加一个额外的反斜杠来避免反斜杠。例如,不要把
fileName=“aDir\file.txt”
放在Haskell文件中,而是把
fileName=“aDir\\file.txt”
放在Haskell文件中。问题是我真正想要避免的正是这一点。因此,当我编写一个更复杂的程序时,它可以自动执行路径。当您编写一个更复杂的程序时,您将直接从文件中读取该程序,并且它将不受此转义限制。换句话说,如果您有一个配置文件,其中包含文本
aDir\file.txt
,并使用
readFile
将该文件读入
字符串
,则它将产生的
字符串
将与文本
aDir\\file.txt产生的
字符串
相同
。您不必定义
规范化路径
;改用
System.FilePath.normalize
。哦,你说得对。但当我这样做时:normalizePath“C:\Users\admin\Desktop\file.txt”会在字符“U”@CimimUxMaio处抛出:字符串/字符文本中的词法错误:原因是
“C:\Users\admin\Desktop\file.txt”
不是有效的字符串文本,
\U
不正确。如果您想在字符串中使用反斜杠,您需要对其进行转义,如
“C:\\Users\\admin\\Desktop\\file.txt”
,这样就没有任何编程方法可以自动获得“C:\\Users\\admin\\Desktop\\file.txt”?@cimimuxmailo:您可以通过模板haskell yes输入“原始”字符串,但这将在窗帘后面避开反斜杠,请参见编辑。哦,你是对的。但当我这样做时:normalizePath“C:\Users\admin\Desktop\file.txt”会在字符“U”@CimimUxMaio处抛出:字符串/字符文本中的词法错误:原因是
“C:\Users\admin\Desktop\file.txt”
不是有效的字符串文本,
\U
不正确。如果您想在字符串中使用反斜杠,您需要对其进行转义,如
“C:\\Users\\admin\\Desktop\\file.txt”
,这样就没有任何编程方法可以自动获得“C:\\Users\\admin\\Desktop\\file.txt”?@cimimuxmailo:您可以通过模板haskell yes输入“原始”字符串,但这将在窗帘后面避开反斜杠,请参见编辑。