2012-04-12 14 views
14

haskellの指定されたインデックスにある要素を置き換える組み込み関数はありますか?Haskellがリスト内の要素を置換する

例:

replaceAtIndex(2,"foo",["bar","bar","bar"])

は与えるべきである:

["bar", "bar", "foo"] 

を私は私は私自身の機能を作ることができます知っているが、ちょうどそれがビルトインされなければならないようです。

答えて

9

実際の配列はありますが、リストは実際には単独でリンクされたリストであり、要素を置き換えるという概念はあまり明確ではありません(特定のインデックスの要素にアクセスすると、それを促す可能性のある操作は避けられます)。

11

私が知る限り(見つけ出すことができる)、デフォルトでは存在しません。しかし、存在splitAtようData.Listで:

replaceAtIndex n item ls = a ++ (item:b) where (a, (_:b)) = splitAt n ls 

これはしかし、O(N)です。このようなことがたくさんある場合は、配列などの別のデータ型を見てください。

+6

一般的に 'O(n)'ではなく 'i(i)'の部分インデックスです(プレフィックスだけをコピーする必要があるため)。そのインデックスが一定の場合、演算は 'O(1)'になります。 –

+3

タイプシグネチャを含めることをお勧めします。replaceAtIndex :: Int - > a - > [a] - > [a] ' –

29

特定のインデックスの要素を更新する必要がある場合、リストはそのための最良のデータ構造ではありません。代わりにをData.Sequenceから使用することを検討してください。この場合、探している機能はupdate :: Int -> a -> Seq a -> Seq aです。

> import Data.Sequence 
> update 2 "foo" $ fromList ["bar", "bar", "bar"] 
fromList ["bar","bar","foo"] 
+0

これはまさに私が必要としているようです。ありがとう! –

+0

私はこれをしました。今、Seq aをどのように変更するのですか? –

+0

@MickaelBergeronNéronあなたは 'Data.Foldable.foldr(:) []'で 'Seq a'の' [a] 'を得ることができます。 'f :: a - > a '操作をしている場合、' Data.Foldable.foldr f'をいくつかの初期要素(0など)で呼び出して、結合した 'a'値を得ることができます。 –