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)に項目が 1 つ残っている場合、xs == []. (たとえば(x:xs)、アイテムのみが含まれている場合1x == 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 == Falsefor 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 に答える