错误:"变量不在范围内:(<>)"与图书馆optparse-applicative

时间:2017-11-12 12:34:56

标签: parsing haskell command-line optparse-applicative

我正在观看由Richard Cook在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")

实际上,在我写的所有地方&#34;&lt;&gt;&#34;,我得到一个错误,编译器告诉我:

• 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。

但由于我很新,我无法弄清楚如何重写理查德库克的代码。

我将不胜感激任何帮助。

提前致谢, 亚历

1 个答案:

答案 0 :(得分:4)

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

  

可以通过使用Monoid操作memptymappend或其别名idm<>组合此处提供的基本修饰符来创建修饰符

看起来它不会导出<>,所以你需要从Data.Monoid获取它:

import Data.Monoid

......或只是:

import Data.Monoid ((<>))