2017-11-11 294 views
2

我正在寫一個函數,parseArgs,它將以列表的形式接受命令行參數。如果列表的大小是2,則函數將解析列表的內容並將它們轉換爲元組,否則返回Nothing。我不確定如何去做這件事。我的代碼迄今低於:Haskell List to Tuple

parseArgs :: [String] -> Maybe (String, Maybe String) 
parseArgs [x, y] 
    | length [x, y] < 2 = Nothing 
    | length [x, y] > 2 = Nothing 
    | otherwise = Just (x, Just y) 

回答

7

在你的代碼, parseArgs [x, y]意味着它僅接受正好有兩個元素的列表。 所以length [x, y]將永遠是2,那些(> 2)(< 2)條件永遠不會被滿足。

otherwise將始終是兩個元素的列表。所以當輸入是兩個元素的列表時,你可以得到x和y,並且確定它們是一個Maybe元組。

但除此之外,如果您parseArgs []parseArgs ["a"]parseArgs ["a","b","c"],您會收到一個異常「函數parseArgs中的非窮舉模式」。 這是因爲代碼沒有涵蓋所有的模式[String]

我使用Maybe(字符串,字符串)輸出在這裏。這意味着parseArg將產生Just(String,String)或Nothing。也許它更接近你想要的。

那麼試試這個:

parseArgs :: [String] -> Maybe (String, String) 
parseArgs x:y:[] = Just (x,y) 
parseArgs xs = Nothing 

這意味着如果輸入[字符串]恰好是X:Y:[](一個確切的兩個字符串列表),僅產生(X,Y)。除此之外,不產生任何東西。通過這種方式,它覆蓋了[String]中的所有模式。如果不是兩個元素的列表,則可以獲得Nothing

編輯: 第二個到@ pdoherty926的parseArgs _ = Nothing,通配符_是表達「其他」的更好方法。

5

@Johhny廖打我,但這裏是我類似的回答:

根據您的要求,我不清楚爲什麼第二元組元素是Maybe String。所以,我將繼續進行,好像您的功能類型是:parseArgs :: [String] -> Maybe (String, String)

parseArgs :: [String] -> Maybe (String, String) 
parseArgs [x, xx] = Just (x, xx) -- pattern match on the list of two elements 
parseArgs _ = Nothing    -- discard _everything_ else 

print $ parseArgs ["hi", "bye"] -- Just ("hi", "bye") 
print $ parseArgs ["hi"]    -- Nothing