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
String Haskell:字符串分析器无法识别转义双引号_String_Haskell_Parsec - Fatal编程技术网

String Haskell:字符串分析器无法识别转义双引号

String Haskell:字符串分析器无法识别转义双引号,string,haskell,parsec,String,Haskell,Parsec,我有这个解析器(在48小时内编写Lisp的练习): import Text.ParserCombinators.Parsec 进口管制 data LispVal=字符串派生显示 parseString::Parser LispVal parseString=do char'' x'\n' 'r'->'\r' 't'->'\t' 因此,这段代码似乎适用于包含所有转义字符的字符串,只有当字符为\“时,它似乎才结束字符串 我收到一个警告,因为模式匹配不是详尽的,一般情况下应该是什么 在“some\

我有这个解析器(在48小时内编写Lisp的练习):

import Text.ParserCombinators.Parsec
进口管制
data LispVal=字符串派生显示
parseString::Parser LispVal
parseString=do char''
x'\n'
'r'->'\r'
't'->'\t'
因此,这段代码似乎适用于包含所有转义字符的字符串,只有当字符为\“时,它似乎才结束字符串

  • 我收到一个警告,因为模式匹配不是详尽的,一般情况下应该是什么
  • 在“some\”string这样的情况下,代码似乎失败了,它成功了,但返回“some”

    • 我看不出这方面有任何问题:

      λ *Main > parseTest parseString $ show "some\"string"
      String "some\"string"
      
      λ *Main > show "some\"string"
      "\"some\\\"string\""
      
      λ *Main > parseTest parseString "\"some\\\"string\""
      String "some\"string"
      
      -- This happened? Escaping is tricky.
      λ *Main > parseTest parseString "\"some\"string\""
      String "some"
      

      请使您的代码自包含。特别是,添加所需的导入。您可以忽略编译器警告,或添加一个case
      ->undefined
      以关闭编译器(从逻辑角度看,这很好)-除此之外,您的代码对我来说很好“返回完整的内部字符串:
      string”\“你好”
      顺便说一句:如果你写
      ['\\','\'']
      ,它的可读性(比
      “\\\\”
      )要高得多(就像你对其中一个
      所做的那样):你的例子也很有效,但当然你必须将它作为
      “\\\\\\\\\\\\\\\\\\\\\\\”someString\\\\\”
      输入到GHCi中(是的,你必须逃避逃避;))请注意,
      '“
      '\”
      是等价的。我这么说是因为你在代码中都使用了这两种方法。感谢
      show
      的技巧,这使它更容易测试!
      λ *Main > parseTest parseString $ show "some\"string"
      String "some\"string"
      
      λ *Main > show "some\"string"
      "\"some\\\"string\""
      
      λ *Main > parseTest parseString "\"some\\\"string\""
      String "some\"string"
      
      -- This happened? Escaping is tricky.
      λ *Main > parseTest parseString "\"some\"string\""
      String "some"