2011-05-13 8 views
3

可能性の重複:私は私の割り当てのこの部分でいくつかの進歩を作るために管理しているが、その一部を添付した
Replace individual list elements in Haskell?アップデート「リストのx番目の要素 - Haskellの

私が作った以下のコード:

module Grid where 

data State = On | Off deriving (Eq, Show) 

next :: State -> State 
next On = Off 
next Off = On 

type Row = [State] 


updateRow :: Row -> Int -> Row 
updateRow (r:rs) x 
    | x == 0  = next r:rs 
-- | otherwise  = ........???? 

最後の行に示されているように、私はupd ateRowは、以下に示すようにx = 0のときに働きます(0番目の要素が反転しています)。

*Grid> updateRow [Off,Off,Off,Off] 0 
[On,Off,Off,Off] 
*Grid> 

このリストの他の要素を反転すると、すべてが元に戻ります。私はこの関数で式を「ジェネラル化」することはできません。事前に

updateRow :: Row -> Int -> Row 

ありがとう:

は、私はまた、このタイプの規則に従わなければなりません。

+0

updateRowを再帰的にしてみてください。ここで何をしたいのかははっきりしない。 – aleator

+0

'slice'関数を見てください。 – abesto

+0

' slice'関数がトラックに入っていません。 – maclunian

答えて

2

何か:一般的な更新機能について

module Grid where 

data State = On | Off deriving (Eq, Show) 

next :: State -> State 
next On = Off 
next Off = On 

type Row = [State] 


updateRow :: Row -> Int -> Row 
updateRow (r:rs) x 
    | x == 0  = next r:rs 
    | otherwise = r : (updateRow rs (x-1)) 
updateRow [] x = [] 
2

previous question you askedに用意されている機能を使用してください。どんなタイプのリストでも動作します。あなたがここでやりたいことをしていると思います。そのような

1

どのように?

update i a as = map repl $ zip as [0..] where 
    repl (a',i') | i == i' = a 
       | otherwise = a' 

パフォーマンスの高いバージョンがありますが、これはわかりやすく、短いリストには十分です。 asi要素(存在する場合)はaに置き換えられます。

+0

少し私のリーグのために進んだ.. – maclunian

+0

それは次のように酷く見えます。まず、すべてをインデックスで圧縮し、指定されたインデックス(要素を置き換える場所)を除いて、すべてを「正常に戻す」ようにマップします。 – Landei

+0

[ここに掲載されています] – luqui

1

実際にあなたのupdateRow機能のotherwise一部のためのアイデアは、あなたが他のquestionreplaceに持っているものに似ています。

アイデアがある:xがゼロでない場合、あなたは(位置ゼロである)要素rをスキップしてsomethingは、アカウントに1つのポジションをとる​​(ある位置でrsupdateRowを呼び出したいことあなたはちょうどスキップしました)。

私はこれが役に立ちそうですか