如果你只是想創建一個高速緩存,那麼你可以只用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