web-dev-qa-db-ja.com

リスト内のHaskell置換要素

Haskellの特定のインデックスの要素を置き換える組み込み関数はありますか?

例:

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

与えるべき:

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

自分で関数を作れることは知っていますが、組み込みのはずです。

17
Stefan Bucur

特定のインデックスで要素を更新する必要がある場合、リストはそのための最も効率的なデータ構造ではありません。代わりにSeq from Data.Sequence の使用を検討することをお勧めします。その場合、探している関数は update :: Int -> a -> Seq a -> Seq a です。 。

> import Data.Sequence
> update 2 "foo" $ fromList ["bar", "bar", "bar"]
fromList ["bar","bar","foo"]
33
hammar

私が知る限り(そして見つけることができる限り)、それはデフォルトでは存在しません。ただし、Data.ListにはsplitAtが存在するため、次のようになります。

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

これはO(N)ですが、これを頻繁に行う場合は、配列などの別のデータ型を調べてください。

12
marinus

実際の配列はありますが、リストは実際には単一リンクリストであり、要素を置き換えるという概念はそれほど明白ではありません(また、特定のインデックスの要素にアクセスすると、リストを使用すべきではないことが示される場合があるため、回避されます)。

10
geekosaur