1

mapArray を使用して可変配列に関数をマップできることがわかりましたが、mapM (および mapM_) のようなものはないようです。mapArray では、その要素を出力できません。次に例を示します。

import Data.Array.Storable

arr <- newArray (1,10) 42 :: IO  -- answer to Life, Universe and Everything
x <- readLn :: IO Int
mapArray (putStrLn.show) arr -- <== this doesn't work!

結果は次のようになります。

No instances for (MArray StorableArray Int m,
                  MArray StorableArray (IO ()) m)
  arising from a use of `mapArray' at <interactive>:1:0-27
Possible fix:
  add an instance declaration for
  (MArray StorableArray Int m, MArray StorableArray (IO ()) m)
In the expression: mapArray (putStrLn . show) arr
In the definition of `it': it = mapArray (putStrLn . show) arr

Haskell (または、標準の Haskell でなくても GHC) にそのようなものはありますか?

また、配列用のfoldr/foldl関数が見つかりませんでした(変更可能かどうかに関係なく)。それらは存在しますか?

どうもありがとう!

4

3 に答える 3

5

モジュールData.Traversableをインポートします。配列やあらゆる種類のものに対してすでに定義されているインスタンスを使用して、必要なものだけの型クラスを定義します。シーケンスとmapMの一般化されたバージョンに加えて、おそらくあまり気にしないであろうさらに一般的な関数がいくつかあります。

単純な

import Data.Traversable as T

T.mapM doIOStuff arr

正常に動作します。

于 2009-10-02T10:55:37.440 に答える
3

多くのミューテーションを行っている場合は、おそらく他の配列ライブラリのいずれかを使用しますか? uvectorのような?

さもないと、

forM_ [1..n] \$ \i ->. unsafeWrite x i 

大丈夫なはずです。

于 2009-09-29T22:48:33.317 に答える
2

すべての要素を出力する例: " mapM_ print . elems" を使用できます。

しかし、各値が前の値のモナド アクションの結果である新しい配列を作成したいように思えますか? その場合:

arrayMapM :: (Monad m, Ix i) => (a -> m b) -> Array i a -> m (Array i b)
arrayMapM func src =
  liftM (listArray (bounds src)) . mapM func . elems $ src
于 2009-09-29T22:46:51.667 に答える