Haskell列表到元组

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)

Joh*_*iao 7

在您的代码中, 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,通配符_是表达"其他一切"的更好方式.


pdo*_*926 5

@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)