list - Haskell 列表到元组

标签 list parsing haskell tuples

我正在编写一个函数 parseArgs,它将以列表的形式接收命令行参数。如果列表的大小为二,函数是解析列表的内容并将它们转换为元组,否则返回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)

最佳答案

在您的代码中, parseArgs [x, y] 意味着它只接受两个元素的列表。 所以 length [x, y] 永远是 2,那些 (>2) (<2) 条件永远不会满足。

否则 将始终是两个元素的列表。所以当输入是一个包含两个元素的列表时,你可以得到 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

这意味着如果输入 [String] 恰好是 x:y:[](正好是两个字符串的列表),则生成 Just (x,y)。除此之外,什么都不生产。这样就覆盖了[String]中的所有模式。当它不是两个元素的列表时,您可以得到 Nothing

编辑: 其次是@pdoherty926 的 parseArgs _ = Nothing,通配符 _ 是表达“其他一切”的更好方式。

关于list - Haskell 列表到元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47234281/

相关文章:

python - 如何检查列表中的项目是否在另一个列表中?

java - 搜索列表中的元素

python - 一个更简单的案例列表

c# - 解析 HTML "Visually"

Haskell 继承 : What's inherity about it?

haskell - 导出类型构造函数有什么不同吗?

haskell - 这个简单的 Haskell 函数是否已经有了一个众所周知的名字?

c# - 在 C# 中的动态对象列表中搜索值

java - 如何匹配括号来解析 S 表达式?

python - 从字符串中删除常用词(及其复数形式)的技术