If you just want to create a cache, you can just use listArrayand mapif you have a list of all your indexes:
myCache :: Array MyType Foo
myCache = listArray (start,end) . map myFunction $ range (start,end)
, MyType Enum; , , . , range.
, ,
myInternalFunc :: MyType -> Foo
myInternalFunc mt = (complex calculation) (using mt)
myFuncCache :: Array MyType Foo
myFuncCache = listArray (start,end) . map myFunction $ range (start,end)
myFunction :: MyType -> Foo
myFunction = (myFuncCache !)
myInternalFunc ; , , myFuncCache, , . , myInternalFunc let - where -block myFuncCache. , myFunction mt , O (1).