optparse-прикладной непустой строковый аргумент

#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 тоже с)