#haskell #optparse-applicative
#haskell #optparse-прикладной
Вопрос:
Как я могу реализовать непустой строковый аргумент?
parserStart :: Parser String
parser = strArgument (metavar "EXAMPLE")
Как можно предотвратить успешный анализ пустой строки — ""
?
Имея предыдущий опыт работы с Parsec / Attoparsec, я предполагаю, что мог бы написать свой собственный синтаксический анализатор или, возможно, использовать что-то прикладное для проверки значения и fail
, если это пустая строка (я думаю, это будет невозможно, так как для этого мне нужна монада)?
Ответ №1:
import Data.String
import Data.Text
import Options.Applicative.Types (ReadM, readerAsk)
nonEmptystr :: IsString s => ReadM s
nonEmptystr = do
readerAsk >>= case
"" -> fail "Invalid argument: Empty string"
x -> pure $ fromString x
f :: Parser Text
f = argument nonEmptystr (metavar "task")
Комментарии:
1. Обычно я пишу эти вещи с
Options.Applicative.eitherReader
помощью , которая является небольшой оболочкой для этого шаблона привязки результатаreaderAsk
и вызоваfail
илиreturn
соответственно:nonEmptyStr = eitherReader case { "" -> Left "…"; x -> Right $ fromString x }
(BlockArguments
тоже с)