嗨,伙计们,我正在尝试使用haskells长度函数和模式匹配来检查列表的长度是否不等于列表中列表的长度
这是我拥有的功能及其类型:
func :: [String] -> [[String]] -> String
,其中返回字符串是";发现不同长度的错误";或"长度是相同的";
这是我要输入的内容,预期输出如下:
["行星"、"城市"][["木星"、"地球"]、["柏林"、"马德里"、"克拉科夫"]]
输出应该是"0";发现不同长度的错误";由于["Berlin", "Madrid", "Krakow"]
的大小为3,其中["Planet", "City"]
的大小为2
有点不确定如何做到这一点,并将感谢任何帮助!
这样的东西会在线性时间中检查它。
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
我认为这为您提供了根据您的确切需求定制输出的基础和必要信息。
您可以编写一个助手函数来检查两个列表是否具有相同的长度,因此您可以实现一个函数:
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"