编辑:这个累了的时候我不应该编码。我正在编译程序的不同副本而不是我正在运行的程序。抱歉浪费你的时间。
我有以下代码在程序启动时使单个参数可选。
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)
答案 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?"
这个例子对我有用,也希望你这样做。)
答案 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
我认为你的问题在别的地方。也许你可以制作一个实际符合并展示问题的最小代码片段?这通常是一个信息丰富的练习。