从包含其中一些字符串的字符串中删除双反斜杠

时间:2015-05-09 17:29:50

标签: string haskell replace backslash

我遇到了麻烦,因为我无法定义一个函数来执行此操作:

输入:“(案例(+ 5 5)((4 9 1)'d64)\\ n((1 2)'pepito)\\ n((10)'jorgito)”
输出:“(案例(+ 5 5)((4 9 1)'d64)\ n((1 2)'pepito)\ n((10)'jorgito)”

我已尝试过这个以及其他许多方面,但没有成功:

base.Draw(...)

我知道最后一个函数没有很好地编码查看它们的参数,但我试图为“所有字符串”做一个替换函数,但我现在还不能。

然后,我的解析器无法工作原因是这样的:

import Data.List.Split (splitOn)
import Data.List (intersperse)
import Data.Char

replace :: String -> String -> String -> [String]
replace current next [] = []
replace current next xs = intersperse [chr 92] $ splitOn current xs

新信息:

Complete code in github.com

适用于GHCi的示例:

parseCaseResult :: Parser LispVal
parseCaseResult = do
    char '\''
    first <- (letter <|> symbol) --de momento será una String
    rest <- many (digit <|> letter <|> symbol)
    return $ String (first:rest)

parseCasePair :: Parser CasePair
parseCasePair = do
    list <- lexeme (char '(') >> (lexeme (char '(')) *> parseList <* (lexeme $ char ')')
    result <- lexeme $ parseCaseResult <* char ')'
    return (list, result)

parseCaseExpr :: Parser LispVal
parseCaseExpr = do
    lexeme $ char '('
    lexeme $ string "case"
    conditional_expr <- lexeme (char '(') *> parseList <* lexeme (char ')')
    -- armada en las nuevas líneas, solucionado con un parser más trabajado
    lista <- sepBy parseCasePair newline -- $ try (string "\\\\\n") <|> try (string "\n") <|> string "\r"
    return $ CaseExpr conditional_expr lista

但是如果我编译并运行*Main> eval $ fromRight $ parse parseExpr "jaja" "(case (+ 5 5) ((4 9 1) 'd64\n((1 2) 'pepito\n((10) 'jorgito)" 10 (4 9 1) 10 (1 2) 10 (10) Right "jorgito" 函数,代码就不起作用了,因为解析器与那些main不匹配。

对于此问题的早期版本中的错误解释感到抱歉。

1 个答案:

答案 0 :(得分:2)

所需的功能是:

foo :: String -> String
foo s = read $ "\"" ++ s ++ "\""

那实现了我想要的,转变:

“(案例(+ 5 5)((4 9 1)'d64)\\ n((1 2)'pepito)\\ n((10)'789.456)”

进入

“(案例(+ 5 5)((4 9 1)'d64)\ n((1 2)'pepito)\ n((10)'789.456)”

现在我的解析器就像魅力一样