2017-11-11 258 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