ベクトルの反復突然変異として最もよく説明される計算があります。最終結果はベクトルの最終状態です。
これを機能させるための「慣用的な」アプローチは、「変更」されるたびに新しいベクターオブジェクトを単純に渡すことだと思います。したがって、反復メソッドはoperate_on_vector :: Vector -> Vector
、ベクトルを取り込んで変更されたベクトルを出力し、メソッドを介して再度供給されます。
この方法は非常に簡単で、Haskell を初めて使用する私でも問題なく実装できました。
あるいは、これらすべてをモナドにカプセル化しState
、常に再作成および変更されるベクトルを状態値として渡すこともできます。
ただし、これらの計算は非常に集中的であり、反復回数が多く (数百万のオーダー)、データ ベクトルがかなり大きくなる可能性があるため (少なくとも数千のプリミティブのオーダー)、非常に大きなパフォーマンス コストが発生します。反復のすべてのステップでメモリ内に新しいベクトルを再作成することは、データ収集であろうとなかろうと、かなりコストがかかるようです。
次に、どのように動作するかを検討しました。状態値が常に変化する「世界」であることを除けば、IO
基本的に のように見ることができます。State
IO
「世界」を「操作」するようなものを使えないでしょうか?そして、「世界」はメモリ内のベクトルになりますか? データベース クエリのようなものですが、すべてがメモリ内にあります。
たとえば、 io を使用すると、次のことができます
do
putStrLn "enter something"
something <- getLine
putStrLine $ "you entered " ++ something
これは、World オブジェクトを "実行"putStrLn
および "変更" し、新しい World オブジェクトを返し、それを次の関数にフィードすると見なすことができます。この関数は、変更の結果である文字列についてワールド オブジェクトをクエリし、別のワールドを返します。別の変更後のオブジェクト。
可変ベクトルに対してこれを行うことができるようなものはありますか?
do
putInVec 0 9 -- index 0, value 9
val <- getFromVec 0
putInVec 0 (val + 1)
、各ステップで新しい変更されたベクトルを渡す代わりに、「不純な」「変更可能な」ベクトルを使用します。