我仍然是Haskell的新手,所以如果有明显的答案就道歉...
我想创建一个函数来分割所有后面的字符串列表,即[String]:
["int x = 1", "y := x + 123"]
["int x= 1", "y:= x+123"]
["int x=1", "y:=x+123"]
Run Code Online (Sandbox Code Playgroud)
全部进入相同的字符串串,即[[String]]:
[["int", "x", "=", "1"], ["y", ":=", "x", "+", "123"]]
Run Code Online (Sandbox Code Playgroud)
您可以使用map words.lines第一个[String].
但我不知道任何真正整洁的方式也考虑到其他人-在这里你会使用不同的子串"=",":=","+"等向上突破的主要字符串.
感谢您花时间在Haskell上启发我:-)
Prelude附带了一个鲜为人知的方便函数lex,它是Haskell表达式的词法分析器.这些符合您需要的形式.
lex :: String -> [(String,String)]
Run Code Online (Sandbox Code Playgroud)
虽然多么怪异!该列表用于与标准类型的解析器连接,但我非常确定lex总是返回1或0个元素(0表示解析失败).元组是(token-lexed, rest-of-input),所以lex只能拉出一个令牌.因此,一个简单的方法来整理整个字符串将是:
lexStr :: String -> [String]
lexStr "" = []
lexStr s =
case lex s of
[(tok,rest)] -> tok : lexStr rest
[] -> error "Failed lex"
Run Code Online (Sandbox Code Playgroud)
为了安抚学生,这段代码很糟糕.显式调用error而不是返回一个合理的错误使用Maybe,假设lex只返回1或0元素等.可靠地执行此操作的代码大约相同的长度,但显着更抽象,所以我饶了你的初学者眼睛.