正在处理一个问题并且它一直给我这个错误: 例外:Prelude.tail:空列表
到目前为止,这是我的代码:
lxP :: Eq a => [[a]] -> [a]
lxP [] = []
lxP xss
| any null xss = []
| otherwise = loop xss []
where loop ::Eq b => [[b]] -> [b] -> [b]
loop xss acc =
let xs = concatMap (take 1) xss
in if any (\x -> x /= head xs) (tail xs)
then reverse acc
else loop (map tail xss) (head xs : acc)
知道我的缩进是问题还是代码的问题? PS。我怎样才能提高效率?
答案 0 :(得分:3)
我无法弄清楚你的功能应该做什么。对我来说这是一个合理的想法是没有意义的。这就是我的样子:
你拿了一些列表列表(让我们说它现在是一个矩阵,因为我要谈论列)你想要返回第一行的最长前缀,这样每个元素都在一个常量列中。 / p>
所以让我们尝试用更惯用的方式来写这个。
现在我们想要在列中寻找常量,但是如果行的长度不同,我们应该怎么做?我将决定我们会忽略它们并想象将所有元素向上推,以便没有间隙。我们将行转换为列:
transpose :: [[a]] -> [[a]]
transpose xss = t xss where
n = maximum (map length xss)
t [] = repeat n []
t (xs:xss) = join xs (t xss)
join [] yss = yss
join (x:xs) (ys:yss) = (x:ys) : join xs yss
现在我们可以编写函数了。
myWeirdFunction xss
| any null xss = []
| otherwise = map head $ takeWhile constant $ transpose xss where
constant (x:xs) = c x xs
c x (y:ys) | y == x = c x ys
| True = False
c x [] = True