1

我正在 SafariBookOnline 上观看 Richard Cook 制作的视频。他使用 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:
    ‘&lt;$>’ (imported from Options.Applicative),
    ‘&lt;*>’ (imported from Options.Applicative),
    ‘&lt;|>’ (imported from Options.Applicative)

我遇到的问题很可能是由于 GHC 和 Optparse-applicative 的版本不同。我用的是最新的。LTS Haskell 9.12:0.13.2.0。

但由于我很新,我不知道如何重写理查德库克的代码。

我将不胜感激任何帮助。

提前致谢, 亚历克斯

4

1 回答 1

4

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

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

不过,它看起来不像 export <>,因此您需要从以下位置获取它Data.Monoid

import Data.Monoid

... 要不就:

import Data.Monoid ((<>))
于 2017-11-12T12:47:05.613 回答