-2
遇到麻煩,因爲我不能定義一個函數來做到這一點:除去雙反斜線
輸入:「(情況(+ 5 5)((4 9 1)' ((1 2)'pepito)\\ n((10)'jorgito)「
輸出:」(case(+5 5)((4 9 1)'d64)\ n((1 2) 'pepito)\ n((10)' jorgito)」
我已經試過這和許多其他,都沒有成功:
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
我知道最後的功能沒有得到很好的編碼尋找他們的論據, 但是我 試圖做一個「所有字符串」的替換功能,但我現在不能。
然後,我的解析器不能工作的原因是這樣的:
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
新信息:
例,在GHCI工作:
*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
函數,代碼不會工作k我認爲是因爲解析器不匹配那些\\n
。
對不起,在這個問題的早期版本中的不好解釋。
轉義使這有點混亂。你是否正在尋找一個函數,將n轉換爲一個實際的換行符? –
@DavidYoung現在它被編輯了,我認爲這更清楚。當我做'getArgs'時,那個getArgs給了我一個'\\'的'String',所以我的解析器不能解析這個,並且我的程序失敗了。 – freinn
請注意,當您打印一個包含單個反斜槓的字符串時,Haskell會引用該反斜槓。你確定這個字符串實際上是否包含一個雙反斜槓,或者它可能只有一個'\ n'? 關於你的問題令人困惑的是,在Haskell語法中,第一個字符串包含一個'\ n',而第二個字符串包含一個ascii換行字符。 – lpsmith