代码之家  ›  专栏  ›  技术社区  ›  Macha

匹配大小可变的Haskell列表的模式

  •  1
  • Macha  · 技术社区  · 14 年前

    编辑 :我不应该在这么累的时候编码。我编译的程序与运行的程序不同。抱歉浪费你的时间。

    main = do
        args <- getArgs
        handleArgs args
    
    handleArgs :: [String] -> IO ()
    handleArgs (server:nick:channel:[]) = IRC.startIRC server 6667 nick channel
    handleArgs (server:port:nick:channel:[]) = IRC.startIRC server (read port :: Int) nick    channel
    handleArgs _ = putStrLn "Incorrect arguments given."
    

    ./program irc.freenode.net 6667 somenick #somechannel ,它运行。但是,如果我像 ./program irc.freenode.net somenick #somechannel ,这将使args成为一个列表 "irc.freenode.net":"somenick":"#somechannel":[] 如果我理解正确, 它给出了一个指向 args <- getArgs 当我在用ghc编译后尝试运行它时。

    mbot: user error (Pattern match failure in do expression at core.hs:9:4-32)

    3 回复  |  直到 14 年前
        1
  •  4
  •   Rüdiger Hanke shraddha hattimare    14 年前

    # 作为评论,例如 interactive_comments #somechannel 可能被解释为评论。

        2
  •  2
  •   Jakob Runge    14 年前

    我认为,你的问题来自于在两种模式中使用xs, 什么时候适合与[]

    foobar :: [String] -> String
    foobar (a:b:[]) = b         -- matches on exactly two items
    foobar (a:b:c:[]) = c -- matches on exactly three items
    foobar _ = "hurz?"
    

    这个例子对我很有用,希望你也能这么做。)

        3
  •  1
  •   Thomas M. DuBuisson    14 年前

    无法复制:

    import System.Environment (getArgs)
    main = do
        args <- getArgs
        handleArgs args
    
    handleArgs :: [String] -> IO ()
    handleArgs (server:port:nick:channel:xs) = print 4
    handleArgs (server:nick:channel:xs) = print 3
    

    输出:

    $ ghc --make match.hs
    [1 of 1] Compiling Main             ( match.hs, match.o )
    Linking match ...
    $ ./match
    match: match.hs:(7,0)-(8,44): Non-exhaustive patterns in function handleArgs
    
    $ ./match a b c
    3
    $ ./match a b c d
    4
    $ ghc -V
    The Glorious Glasgow Haskell Compilation System, version 6.12.1
    

    我想你的问题在别处。也许你可以做一个最小的代码,实际上符合和展示问题?这通常是一个有益的练习。