我对Haskell还很陌生,所以如果这个问题有一个明显的答案,请道歉……
我想做一个函数,拆分以下所有的字符串列表,即字符串
["int x = 1", "y := x + 123"]
["int x= 1", "y:= x+123"]
["int x=1", "y:=x+123"]
都包含在相同的字符串中,即[字符串]:
[["int", "x", "=", "1"], ["y", ":=", "x", "+", "123"]]
您可以使用map words.lines
作为第一个字符串。
但是我不知道有什么很好的方法来考虑其他的--你可以使用不同的子字符串"="
,":="
,"+"
等来分解主字符串。
感谢您抽出时间在Haskell上给我一些启发:-)
发布于 2010-11-28 11:21:21
Prelude附带了一个鲜为人知的方便函数,名为lex
,这是一个用于Haskell表达式的lexer。这些与您需要的表单相匹配。
lex :: String -> [(String,String)]
这是一个多么奇怪的类型啊!该列表用于与标准类型的解析器进行交互,但我非常确定lex
总是返回1或0个元素(0表示解析失败)。元组是(token-lexed, rest-of-input)
,所以lex
只获取一个令牌。因此,对整个字符串进行lex的一种简单方法是:
lexStr :: String -> [String]
lexStr "" = []
lexStr s =
case lex s of
[(tok,rest)] -> tok : lexStr rest
[] -> error "Failed lex"
为了安抚学究,这段代码的形式很糟糕。显式地调用error
,而不是使用Maybe
返回合理的错误,假设lex
只返回1或0个元素,等等。可靠地做到这一点的代码长度大致相同,但明显更抽象,所以我留出了初学者的眼睛。
发布于 2010-11-28 10:26:03
我将研究一下parsec,并构建一个简单的语法来解析您的字符串。
发布于 2010-11-28 10:47:39
使用单词怎么样?) words :: String -> [String]
和单词不关心空格。
words "Hello World"
= words "Hello World"
= ["Hello", "World"]
https://stackoverflow.com/questions/4294973
复制相似问题