2012-07-07 237 views
0

我有幾個命令行選項(例如5),我想將它們轉換爲元組。問題是我期望它們以正確的順序出現,所以元組可以使用模式匹配從列表中輕鬆構建,但在現實生活中,可以隨機順序提供選項,所以我不知道列表的頭部是否包含詳細選項或日誌文件名稱?將列表轉換爲元組

我試着想如何使用延續傳遞風格來做到這一點,然而沒有任何有用的東西進入我的腦海。

這有可能嗎?

我認爲我可以對列表進行「排序」,使其按照預測的順序排列,但看起來不太好。

另外我可以擺脫元組並創建數據記錄 - 但是這仍然會導致檢查屬性的類型並設置記錄的正確字段。還有很多打字。

+0

您是否考慮過使用hackage上的衆多命令行解析包之一? – 2012-07-07 07:34:13

+0

@NathanHowell我正在使用GetOpt和Permute訂購 – jdevelop 2012-07-07 07:35:02

+1

像'cmdargs'和'optparse-applicative'這樣的軟件包會填充記錄字段。忽略命令行中參數的順序。您可以嘗試其中一種或兩種方法作爲GetOpt的替代方案。 – 2012-07-07 07:43:03

回答

1

鑑於你所描述的,我認爲你有兩個選擇。在這兩個,我會說,轉換成字典將是最簡單的,但轉換成一個元組會工作,只有一點點笨拙

因此,採取這樣的定義:

options :: [OptDescr (String, String)] 
options = [Option ['a'] ["alpha"] (ReqArg (\a -> ("alpha", a)) "empty") "", 
      Option ['b'] ["beta"] (ReqArg (\a -> ("beta", a)) "empty") "", 
      Option ['g'] ["gamma"] (ReqArg (\a -> ("gamma", a)) "empty") ""] 

main = do 
    args <- getArgs 
    let (opts, nonopts, errs) = getOpt Permute options args 
    putStrLn $ show opts 

由此看來,一個我的示例輸出的幾個是:

[("beta","b"),("alpha","a")] 
[("alpha","a"),("gamma","g"),("beta","b")] 

等等。與命令行上的順序相同。但是,由於我在上面設置的方式,我基本上有一個關聯列表,所以...如果我特別想要一個具有值(alpha,beta,gamma)的Tuple,那麼我最好的選擇是......

(lookup "alpha" opts, lookup "beta" opts, lookup "gamma" opts) 

您得到的數據類型將是(也許字符串,字符串也許,也許字串),在「阿爾法」,「beta」和「伽馬」的順序。