することができますthe data
declaration in the Data.Array.IArray
module for the Array
typeにはデータコンストラクタが公開されていないため、配列のパターンは一致しません。これは、Haskellの一般的な方法です。なぜなら、作成者は、モジュールのユーザーにとって大きな変更を加えることなく、データ型の内部表現を更新できるからです。
したがって、Array
を使用する唯一の方法は、モジュールが提供する機能を使用することです。配列の最初の値にアクセスするには、bounds
と(!)
の組み合わせを使用するか、最初のキーと値のペアをassocs
から取得します。次に、(//)
を使用して配列を更新することができます。
arraytest arr = arr // [(index, value + 1)]
where
index = fst (bounds arr)
value = arr ! index
あなたがassocs
を使用することを選択した場合は、パターンマッチはその結果にすることができます:
arraytest arr = arr // [(index, value + 1)]
where
(index, value) = head (assocs arr) -- `head` will crash if the array is empty
それとも、リストやタプルのためFunctor
インスタンスを利用することができます:
arraytest arr = arr // take 1 (fmap (fmap (+1)) (assocs arr))
あなたはおそらくすぐに気づくでしょうが、array
パッケージ多くの便利な機能が欠けています。上記のすべてのソリューションは、操作が他の言語でどのように実装されるかと比べてかなり冗長です。
これを修正するには、lens
パッケージ(およびその同類)があります。これは、Haskellに便利な機能を追加し、array
などのパッケージをはるかに耐えるものにします。このパッケージは非常に急な学習曲線を持っていますが、非常に一般的に使用されており、学ぶ価値があります。
import Control.Lens
arraytest arr = arr & ix (fst (bounds arr)) +~ 1
あなたの目を細めている場合、あなたはほとんどそれがarr[0] += 1
言う方法を確認することができますが、我々はまだ不変性の利点のいずれかを犠牲にしていません。
配列を一致させることはできません。 Data.Arrayオンラインで文書化されている関数を調べます。 –
'array'パッケージ内の不変の配列は、実際にそのように使うつもりはありません。不変配列は、高レベルの作成関数の1つを使用するか、 'STArray'または' IOArray'をフリーズすることによって、一度に "一度に"作成するのが最適です。作成後、通常は変更したくない場合があります。そうすることは、配列が大きい場合には非常に高価です。私は、実際に高性能の不変な配列のような構造のための、生産品質のHaskellライブラリは知らないが、近年いくつか有望な実験が行われている。 – dfeuer