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

时间:2010-10-03 18:35:59

标签: haskell pattern-matching

编辑:这个累了的时候我不应该编码。我正在编译程序的不同副本而不是我正在运行的程序。抱歉浪费你的时间。

我有以下代码在程序启动时使单个参数可选。

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":[], 当我在使用ghc编译后尝试运行它时,它会给出一个指向args <- getArgs行的模式匹配错误。

更准确地说,错误是: mbot: user error (Pattern match failure in do expression at core.hs:9:4-32)

3 个答案:

答案 0 :(得分:4)

检查您的shell是否未将以#开头的部分解释为注释,例如bash与interactive_comments on(shopt)。 #somechannel可能会被解释为评论。

答案 1 :(得分:2)

我认为,你的问题来自两种模式中使用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?"

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

  • 事实是,与xs的匹配与空列表以及任何其他剩余尾部匹配。

答案 2 :(得分:1)

无法重现:

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

我认为你的问题在别的地方。也许你可以制作一个实际符合并展示问题的最小代码片段?这通常是一个信息丰富的练习。