3

実装しようとしているソルバーのために、リストを指定して3つの同一で隣接する番号を検索する関数を作成しようとしています。次に、3つの同一の隣接する番号がある場合、1番目と3番目の同一の番号を「0」にマークし、中央の値を負に設定します。

なぜこれが私にエラーを与えているのか疑問に思っています。

change xs = chnge xs []
    where
    chnge xs acc
        | length xs <= 2 = [acc]
        | (head xs == xs !! 1) && (head xs == xs !! 2) = [0, (xs !! 1)*(-1), 0] ++ tail xs
        | otherwise = chnge (tail xs) (acc ++ head xs)
4

1 に答える 1

9

はリストなので、の最初のガードにacc戻りたくはありませんが、 ;だけです。同様に、あなたが望まない行では、それはリストのリストであることを意味します-他にどのようにその最初のメンバーを追加可能にすることができますか?むしろそうかもしれません:[acc]chngeaccotherwiseacc ++ head xsxsacc ++ [head xs]

change xs = chnge xs [] where
  chnge xs acc
        | length xs <= 2 = acc
        | (head xs == xs !! 1) && (head xs == xs !! 2) = [0, (xs !! 1)*(-1), 0] ++ tail xs
        | otherwise = chnge (tail xs) (acc ++ [head xs])

これは少しずれているように見えますが、本当の問題は「パターンマッチング」の不足と、、およびの危険なhead使用tailです!!。もっとこのようなことを試してみてください、多分?(ただし、アキュムレータは使用しません):

change []     = []
change [x]    = [x]
change [x,y]  = [x,y]
change (x:y:z:ws) | x == y && y == z = 0 : (-y) : 0 : change ws
change (x:xs) =  x : change xs

--  *Main> change [12,12,66,66,66,44,44,99,99,99,76,1]
--  [12,12,0,-66,0,44,44,0,-99,0,76,1]

3列の場合はパターンと見なすことができるので、それらが等しい場合の特別な場合を作成します。

于 2012-10-04T23:33:59.200 に答える