Ошибка: переменная вне области действия: (‹›) с библиотекой optparse-applicative

Я смотрел видео, снятое Ричардом Куком на SafariBookOnline. Он создает приложение командной строки с помощью Haskell. В этом видео он объясняет некоторые основные понятия при написании программы для разбора аргументов командной строки.

Я новичок в Haskell и не могу понять, почему этот код не работает:

dataPathParser :: Parser FilePath
dataPathParser = strOption $
  value defaultDataPath
  <> long "data-path"
  <> short 'p'
  <> metavar "DATAPATH"
  <> help ("path to data file (default " ++ defaultDataPath ++ ")")

Этот код работает плохо:

itemDescriptionValueParser :: Parser String
itemDescriptionValueParser =
  strOption (long "desc" <> short 'd' <> metavar "DESCRIPTION" <> help "description")

И действительно, везде, где я писал "‹>", я получал ошибку, когда компилятор говорит мне, что:

• Variable not in scope:
    (<>) :: Mod f5 a5 -> Mod f4 a4 -> Mod ArgumentFields ItemIndex
• Perhaps you meant one of these:
    ‘<$>’ (imported from Options.Applicative),
    ‘<*>’ (imported from Options.Applicative),
    ‘<|>’ (imported from Options.Applicative)

Проблема, которая у меня возникла, скорее всего, связана с разницей версий GHC и Optparse-applicative. Я использую последние. LTS Haskell 9.12: 0.13.2.0.

Но поскольку я совсем новичок, не могу понять, как переписать код Ричарда Кука.

Буду признателен за любую помощь.

Заранее спасибо, Алекс


person Alex k    schedule 12.11.2017    source источник


Ответы (1)


http://hackage.haskell.org/package/optparse-applicative-0.14.0.0/docs/Options-Applicative.html#t:Parser:

Модификатор может быть создан путем составления основных модификаторов, представленных здесь, с использованием Monoid операций mempty и mappend или их псевдонимов idm и <>.

Однако похоже, что он не экспортирует <>, поэтому вам нужно получить его из Data.Monoid:

import Data.Monoid

... или просто:

import Data.Monoid ((<>))
person melpomene    schedule 12.11.2017
comment
Большое спасибо! Вам это может показаться тривиальным, но я начинаю с Haskell и думал о проблеме в коде, а вовсе не в импорте. Спасибо еще раз! - person Alex k; 12.11.2017
comment
@Alexk Да, это не очевидно. Похоже, что примеры были написаны для более ранней версии optparse-applicative, которая экспортировала (<>), но была изменена по непонятной мне причине: github.com/pcapriotti/optparse-applicative/issues/224 - person melpomene; 12.11.2017