【问题标题】:How to check if length of a list is not equal to length of a list within a list in haskell如何检查列表的长度是否不等于haskell中列表中的列表长度
【发布时间】:2021-10-12 20:29:33
【问题描述】:

大家好,我正在尝试使用 haskells 长度函数和模式匹配检查列表的长度是否不等于列表中列表的长度

这是我拥有的功能及其类型:

func :: [String] -> [[String]] -> String 

其中返回字符串是“发现不同长度的错误”或 “长度相同”

这是我要输入的内容,预期的输出如下:

[“行星”、“城市”] [[“木星”、“地球”]、[“柏林”、“马德里”、“克拉科夫”]]

由于["Berlin", "Madrid", "Krakow"] 的大小为 3,而 ["Planet", "City"] 的大小为 2,因此输出应为“发现长度不同的错误”

有点不确定如何做到这一点,希望能得到任何帮助!

【问题讨论】:

  • 如何检查两个列表的长度是否相同?
  • 看到我这样做了,说我们有字符串列表为 (x:xs) 和字符串列表为 (y:ys) 然后你会做长度 (x:xs) /= 长度 (y :ys) 但如果你得到我@WillemVanOnsem,我不确定如何处理字符串列表

标签: list haskell


【解决方案1】:

这样的事情会在线性时间内检查它。

compLength :: [String] -> [[String]] -> String
compLength s = go (length s)
  
  where go _ []   = "All Good! Hurray!"
        go n (y:ys)
          | n /= length y = "Error different lengths found" ++ " [" ++ unwords y ++ "]"
          | otherwise      = go n ys

我认为这为您提供了根据您的确切需求定制输出的基础和必要信息。

【讨论】:

    【解决方案2】:

    您可以编写一个辅助函数来检查两个列表是否具有相同的长度,这样您就可以实现一个函数:

    sameLength :: [a] -> [a] -> Bool
    sameLength … = …

    当你实现了这样的功能时,只需检查所有子列表是否具有相同的长度。我们可以通过all :: Foldable f => (a -> Bool) -> f a -> Bool 做到这一点:

    func :: [a] -> [[a]] -> Bool
    func xs yss
        | all (sameLength xs) yss = "Lengths are the same"
        | otherwise = "Error different lengths found"
    

    【讨论】:

      猜你喜欢
      • 2015-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多