2014-10-20 3 views
0

Знаменитые «Learn You Haskell Для Блага» книга содержит пример аргументов командной строки парсинга:тест сопоставление с образцом в Haskell

dispatch :: String -> [String] -> IO() 
dispatch "add" = add 
dispatch "view" = view 
dispatch "remove" = remove 
main = do 
    (command:argList) <- getArgs 
    dispatch command argList 

До сопоставление с образцом не является простым, нет никакого смысла в тестировании, но вещи быстро становятся все более сложными:

main :: IO() 
main = getArgs >>= dispatch 

dispatch :: [String] -> IO() 
dispatch ("add":args) = add args >> list 
dispatch ("remove":args) = remove args >> list 
dispatch ("view":[]) = list 
dispatch [] = list 
dispatch _ = usage 

Теперь идея появляется, чтобы проверить, если каждый отдельный вход образец вызывает правильную ветвь шаблонов соответствия. Если отправка должна была что-то вернуть, это не проблема, но, к сожалению, это не так. Мои мысли:

  1. Я чувствую отправка должна возвращать «действие», но соответствие еще раз действие кажется глупо :)
  2. Может быть картина синхронизм неправильно здесь, хотя это выглядит как хороший тест случае.
  3. Может быть кодом должны быть переработано, чтобы сделать возвращение диспетчерского что-то, и это единственным способом
  4. Что-то другое

Я хотел бы иметь подсказку, какие предположения верны, и каков не.

Заранее благодарен!

+0

Дон «Не понимаю, в чем проблема: ( – yihuang

ответ

0

Если вы читаете, LYAH предлагает некоторые идеи, которые помогут повысить надежность этой программы, особенно с использованием монады Maybe и lookup.

В отношении вашего нумерованного списка:

  1. Отправка может вернуть Action() если вы определили свой собственный тип, но add, view и т.д. также должны вернуть Action().
  2. Я думаю, что соответствие шаблону подходит для задачи. Улучшение читаемости этого dispatch может быть достигнуто с помощью расширения на PatternSynonyms язык, доступный в GHC по состоянию на 20 января 2014 года: https://github.com/ghc/ghc/commit/4f8369bf47d27b11415db251e816ef1a2e1eb3d8
  3. Как и в пункте 1. , вы должны соблюдать типы возвращаемых add, view и т.д.
  4. Кто знает! Вы идете дальше и проверить возможные входы с использованием QuickCheck путем определения instance Arbitrary Input но тестирование все возможные входы для getLine может занять некоторое время ... :-P

Я надеюсь, что это помогло

+1

С первым, я думаю, он имел в виду, что' dispatch' должен просто вернуть обработанное 'Action' (например,' Add args', 'Remove args', ...), которое позже передается к некоторой другой функции ('execute' например'), которая будет выполнять действия синтаксического анализа. По существу разделение '[String] -> IO()' in: '[String] -> Action' и' Action -> IO() '. – Shoe

+0

Спасибо, это похоже на ответ, который я искал – tort

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