साथ optparse-अनुप्रयोगी विकल्प मैं optparse-applicative
उपयोग कर रहा हूँ और मैं इस तरह के रूप आदेश पंक्ति तर्क पार्स करने के लिए सक्षम होने के लिए करना चाहते हैं:से अधिक मान
$ ./program -a file1 file2 -b filea fileb
यानी, दो स्विच, जो दोनों के कई तर्क ले जा सकते हैं ।
data MyOptions = MyOptions {
aFiles :: [String]
, bFiles :: [String] }
और फिर एक Parser
इस तरह::
तो मैं जो इस तरह दिखता है मेरे विकल्प के लिए एक डेटा प्रकार है
config :: Parser MyOptions
config = MyOptions
<$> option (str >>= parseStringList)
(short 'a' <> long "aFiles")
<*> option (str >>= parseStringList)
(short 'b' <> long "bFiles")
parseStringList :: Monad m => String -> m [String]
parseStringList = return . words
यह दृष्टिकोण में विफल रहता है यह अपेक्षित परिणाम दे देंगे कि जब प्रत्येक स्विच के लिए केवल एक तर्क प्रदान किया जाता है, लेकिन यदि आप दूसरा तर्क देते हैं तो आपको उस दूसरे तर्क के लिए "अवैध तर्क" मिलता है।
मुझे आश्चर्य हुआ कि क्या मैं यह दिखाकर इसे रोक सकता हूं कि मैं चार विकल्प चाहता था: एक बूलियन स्विच (यानी -a
); तारों की एक सूची; एक और बुलियन स्विच (यानी -b
); और तारों की एक और सूची। तो मैं अपने डेटा प्रकार परिवर्तित:
data MyOptions = MyOptions {
isA :: Bool
, aFiles :: [String]
, isB :: Bool
, bFiles :: [String] }
और फिर इस तरह पार्सर संशोधित:
config :: Parser MyOptions
config = MyOptions
<$> switch
(short 'a' <> long "aFiles")
<*> many (argument str (metavar "FILE"))
<*> switch
(short 'b' <> long "bFiles")
<*> many (argument str (metavar "FILE"))
इस बार के बजाय एक स्ट्रिंग सूची के लिए एक स्पष्ट पार्सर many
और argument
combinators का उपयोग कर।
लेकिन अब पहले many (argument str (metavar "FILE"))
सभी तर्कों की, -b
स्विच निम्नलिखित उन सहित खपत करता है।
तो मैं इस तर्क पार्सर को कैसे लिख सकता हूं?
नि: शुल्क तर्क अस्पष्ट नहीं होंगे यदि '-a 'के तर्कों को' -' से शुरू नहीं किया गया था, हालांकि। – rampion