【问题标题】:Haskell List to TupleHaskell 列表到元组
【发布时间】:2018-04-24 08:40:41
【问题描述】:

我正在编写一个函数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)

【问题讨论】:

    标签: list parsing haskell tuples


    【解决方案1】:

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

    otherwise 将始终是两个元素的列表。所以当输入是一个包含两个元素的列表时,你可以得到 x 和 y,并且确定它们是一个 Maybe tuple。

    但除此之外,如果你 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,通配符 _ 是表达“其他一切”的更好方式。

    【讨论】:

      【解决方案2】:

      @Johhny Liao 击败了我,但这是我的类似答案:

      根据您的要求,我不清楚为什么第二个元组元素是Maybe String。所以,我将继续,就好像你的函数类型是:parseArgs :: [String] -&gt; 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
      

      【讨论】:

        猜你喜欢
        • 2016-07-31
        • 1970-01-01
        • 1970-01-01
        • 2015-08-03
        • 1970-01-01
        • 1970-01-01
        • 2019-02-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多