2010-10-03 2 views
1

EDIT: Я не должен кодироваться, когда это устало. Я составлял другую копию программы, чем я запускал. Извините за то, что потратил ваше время.Образец Соответствие списку Haskell с переменным размером

У меня есть следующий код, чтобы сделать один аргумент необязательным при запуске моей программы.

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)

+0

Как быстрая ссылка: эту функцию 'main' можно было бы лучше написать как' getArgs >> = handleArgs'. – Chuck

ответ

4

Убедитесь, что ваша оболочка не интерпретирует деталь, начиная с # в качестве комментария, например. bash с interactive_comments on (shopt). #somechannel может быть интерпретирован как комментарий.

+1

Это касается меня и bash - ему нужно избежать #. –

2

Я думаю, ваша проблема исходит от использования хза в обеих моделях, , когда это будет уместно, чтобы соответствовать против []

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 соответствует пустым спискам как а также любой другой оставшийся хвост.
+0

Не повезло, к сожалению, обновил код в вопросе, хотя, потому что ваш путь имеет больше смысла. – Macha

+1

Нет, его оригинальная версия была в порядке - проблема в том, что он не показал. –

+0

Я вижу .. чем я не могу воспроизвести проблему сейчас, извините –

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 

Я думаю, что вы проблема в другом. Возможно, вы могли бы сделать минимальный код, который действительно соответствует и демонстрирует проблему? Это обычно информативное упражнение.

+0

Вот полный источник файла: http://github.com/Macha/Mbot/blob/master/core.hs. Насколько я понимаю, определение IRC.startIRC не должно влиять на эту ситуацию. – Macha

+0

Рудигер решил это - сбежать от '#'. –

Смежные вопросы