来自热门optparse库的介绍性代码段:
<$>
请参阅代码段中的注释以了解我的问题/混淆。
Q1:如何将Sample
用作类型构造函数<>
的第一个参数?我认为这个操作必须在函数和函子之间使用。
Q2:此代码段中使用的操作{{1}}是什么?
答案 0 :(得分:9)
Q1:如何将
<$>
用作类型构造函数Sample的第一个参数?我认为这个操作必须在函数和函子之间使用。
反过来说:Sample
是(<$>)
的第一个参数,它被映射到Parser String
生成的strOption
。
Q2:此代码段中使用的操作
<>
是什么?
(<>)
是来自Monoid
课程的mappend
的同义词。在这种情况下,它用于将各个设置组合到要用于您定义的每个命令行选项的设置集中。
答案 1 :(得分:0)
使用ApplicativeDo
和NamedFieldPuns
扩展程序,也可以这样写:
{-# language ApplicativeDo #-}
{-# language NamedFieldPuns #-}
import Options.Applicative
import Data.Monoid
data Sample = Sample
{ hello :: String
, quiet :: Bool }
sample :: Parser Sample
sample = do
hello <- strOption ( long "hello"
<> metavar "TARGET"
<> help "Target for the greeting" )
quiet <- switch ( long "quiet"
<> help "Whether to be quiet" )
pure (Sample {hello,quiet})