如果你只是想创建一个高速缓存,那么你可以只用listArray
和map
,只要你把所有的索引列表:
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
- myFuncCache
之内。一旦你这样做,myFunction mt
只是做一个缓存查找,所以是O(1)。
这是完全有效的(我经常这样做)。事实上,你可以定义一个'createArrayFromFunction'函数,这样你的代码就可以工作。 – 2010-10-17 14:13:34