Wal*_*rty 2 parsing haskell tuples list
我正在编写一个函数,parseArgs它将以列表的形式接受命令行参数.如果列表的大小是2,则该函数将解析列表的内容并将其转换为元组,否则返回Nothing.我不确定如何解决这个问题; 到目前为止,我的代码如下:
parseArgs :: [String] -> Maybe (String, Maybe String)
parseArgs [x, y]
| length [x, y] < 2 = Nothing
| length [x, y] > 2 = Nothing
| otherwise = Just (x, Just y)
Run Code Online (Sandbox Code Playgroud)
在您的代码中,
parseArgs [x, y]意味着它只接受两个元素的列表.所以length [x, y]永远是2,那些(> 2)(<2)条件永远不会被满足.
otherwise将始终是两个元素的列表.所以当输入是两个元素的列表时,你可以得到x和y,并确保它们是一个Maybe元组.
但parseArgs [] parseArgs ["a"] parseArgs ["a","b","c"]除此之外,如果你,你得到一个例外"函数parseArgs中的非详尽模式".这是因为代码没有覆盖所有的模式[String]
我在这里使用Maybe(String,String)作为输出.这意味着parseArg将生成Just(String,String)或Nothing.也许它更接近你想要的东西.
试试这个:
parseArgs :: [String] -> Maybe (String, String)
parseArgs x:y:[] = Just (x,y)
parseArgs xs = Nothing
Run Code Online (Sandbox Code Playgroud)
这意味着如果输入[String]恰好是x:y:[](精确两个字符串的列表),则生成Just(x,y).除此之外,什么都不做.这样,它涵盖了[String]中的所有模式.然后你就可以得到Nothing它不是两个元素的列表.
编辑:第二个是@ pdoherty926 parseArgs _ = Nothing,通配符_是表达"其他一切"的更好方式.
@Johhny Liao打败了我,但这是我的回答:
根据您的要求,我不清楚为什么第二个元组元素会是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
Run Code Online (Sandbox Code Playgroud)