代码之家  ›  专栏  ›  技术社区  ›  Jon Cox

Haskell:用选定的子字符串和空白分隔字符串

  •  2
  • Jon Cox  · 技术社区  · 15 年前

    我还是哈斯克尔的新手,如果有明显的答案,请道歉。。。


    我想创建一个函数,它将拆分以下所有字符串列表,即[字符串]:

    ["int x = 1", "y := x + 123"]
    ["int   x=   1", "y:=   x+123"] 
    ["int x=1", "y:=x+123"] 
    


    全部放入同一字符串,即.[[string]]:

    [["int", "x", "=", "1"], ["y", ":=", "x", "+", "123"]]
    



    你可以用 map words.lines 对于第一个[String]。

    但是我不知道有什么好的方法来考虑其他的因素-在这里你可以使用不同的子字符串 "=" , ":=" , "+" 等来拆开主弦。



    谢谢你抽空给我讲哈斯克尔的故事:-)

    3 回复  |  直到 15 年前
        1
  •  7
  •   luqui    15 年前

    前奏曲附带了一个鲜为人知的便捷函数 lex ,它是Haskell表达式的lexer。这些符合你需要的形式。

    lex :: String -> [(String,String)]
    

    不过,这是一个多么奇怪的类型!列表是用来与标准类型的解析器接口的,但是我很确定 莱克斯 始终返回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"
    

    为了安抚学究们,这个密码的形式很糟糕。明确要求 error 而不是使用 Maybe ,假设 莱克斯 只返回1个或0个元素等。可靠地执行此操作的代码长度大致相同,但明显更抽象,因此我不必让初学者看到。

        2
  •  3
  •   OJ.    15 年前

    我想看看 parsec 并构建一个简单的语法来解析字符串。

        3
  •  0
  •   Jakob Runge    15 年前

    用词怎么样。) words :: String -> [String] 文字不在乎空白。。

    words "Hello World"
    = words "Hello     World"
    = ["Hello", "World"]
    
    推荐文章