程序

时间:2017-12-03 21:23:54

标签: haskell

正在处理一个问题并且它一直给我这个错误: 例外: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。我怎样才能提高效率?

1 个答案:

答案 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