像mapM,但对于数组?(像arrayMap,但映射不纯的函数)

Jay*_*Jay 1 arrays monads haskell

我看到我可以使用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!
Run Code Online (Sandbox Code Playgroud)

结果将是:

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
Run Code Online (Sandbox Code Playgroud)

在Haskell中是否有类似的东西(或者即使不是标准的Haskell,也可以在GHC中)?

此外,我没有发现数组的折叠/折叠函数(可变或不可变).它们存在吗?

非常感谢!

Tir*_*pen 5

导入模块Data.Traversable.它定义了一个类型类,可以为已经为数组和各种事物定义的实例提供所需的类型.它具有序列和mapM的通用版本,以及一些你可能不会经常打扰的更通用的函数.

只是一个简单的

import Data.Traversable as T

T.mapM doIOStuff arr
Run Code Online (Sandbox Code Playgroud)

工作良好.