1

我有一个清单。我需要创建一个新列表,如下例所示: [3, 3, 1, 3]to [3, 3, 3, 1, 1, 3, 3]. 谁能告诉我的代码有什么问题?

add xs
   = let
      adding (x : xs) as
         =
            if x == head(xs) && length(xs) >= 1
               then adding xs (x : as)
               else adding xs (x : x : as)
      adding _ as
         = as
   in
   adding xs []

ghci 告诉总是有空列表是xs,但我有xs length控制权。

4

2 回答 2

3

我不确定您最终要做什么,但我可以帮助您避免“空列表”问题。

当列表(x:xs)中只剩下一项时,xs == []. (例如,如果(x:xs)仅包含项目1,则x == 1,和xs == [])。在这种情况下,由于未为空列表定义而head xs导致异常。head

换行试试

if x == head(xs) && length(xs) >= 1

if length(xs) >= 1 && x == head(xs)

在此更改之后,当xs == [],length(xs) >= 1评估为False。因为False && p == False对于 all p,Haskell 跳过了对另一个表达式 ( x == head(xs)) 的求值,并且避免了异常。

于 2012-05-17T20:35:39.777 回答
0

试试这个:

import Data.List
add xs = concat $ map (\(x:xs) -> x:x:xs) $ group xs
于 2012-05-17T20:41:59.143 回答