函式式語言能否內建乙個 caching 類似的功能用於函式 Memoization, 為什麼

時間 2021-05-06 19:36:47

1樓:艾均博士

用到了自己寫乙個,也不難。

1)用個帶鎖的字典,或者2)直接併發字典,

e.g. 如F# 利用一下ConcurrentDictionary<'T,'V>,match with算過了,直接返回對應'V,with沒算過, 計算,快取了再返回。

2樓:

我覺得強調引用透明的回答是在耍流氓, 你知道乙個函式不是數學意義上的函式還備忘化是不是在耍流氓.

Clojure基本上就是抄了SICP的答案, 但是問題在於能夠使用通用的備忘化的一般可以有乙個更好的更特殊的備忘化的手段, 所以通用的備忘化是沒有必要的.

3樓:羅宸

首先,要注意的是,你的目標是優化效能,而非快取,快取只是實現目標的技術手段之一。

那麼哪幾種情況是可以用快取的方式優化的呢?

1,CAF直接快取其值:其實簡單值的情況是可以被常量摺疊優化掉的(haskell 的 ghc 確實是快取了CAF,畢竟計算結果可能是個無窮列表)

2,同乙個scope裡相同的子表示式重複出現:這種其實編譯期通過CSE提取公共子表示式就能優化掉,沒必要留到執行時去搞快取優化(當然也有人把這種叫快取的,hmm反正理解意思就行,至少我個人理解只有在執行時才知道這兩個東西實際上是同乙個東西的這種技術才叫快取)

3,函式快取其各種輸入對應的返回值:其實這個需要函式的引數滿足一定約束才能實現,比如引數型別得是能作為Map key的,這個約束根據用來作快取的Map容器對key的約束而不同,一般要麼是可雜湊,要麼是可比較。而且快取劃不划算(檢索key的時間成本多大,可能用到多少空間,復用結果的概率有多大)這些資訊其實都是編譯器無法知道的,所以要不要搞這麼一層快取的決定完全可以交給使用者,需要的時候,寫程式的人自己套一層memoize(haskell裡常用memoFix)即可。

綜上所述,一些可以優化的情況其實編譯期優化就能搞定,不需要在執行時做結果快取,還有一些情況要不要快取不適合讓編譯器來做決定,最後確實有一些情況是可以無腦快取的(haskell的CAF),這些其實現代編譯器(ghc)該做的也已經做了。

當然,以上這些情況能被優化(不管是用快取還是其它技術)的前提都是語言本身滿足引用透明性,通俗講你的函式得真的是個純函式(pure function),而不是個子過程(procedure),以及你的函式呼叫真的是個純函式應用,而不是個子過程呼叫才行。

事實上大部分「函式式語言」並不滿足這個前提,所以並不能簡單地直接做這些優化,實在要做也得先通過複雜的靜態分析過程確認這玩意兒是純的。

4樓:

拋磚引玉

對於haskell來說:

list上的memoization用lazy evaluation就能做到了

haskell本身不是parametric的,parametric大意是乙個polymorphic function的行為不取決於具體的type (https://

en.wikipedia.org/wiki/S

ystem_F

),這也是為什麼要有ST monad. 乙個不parametric的function比如在bool上是not,在別的type上都是identity.

Surprisingly我們可以用yoneda lemma來memoize parametric polymorphic functions:http://

conal.net/blog/posts/me

moizing-polymorphic-functions-via-unmemoization

. 但我的理解是parametricity這個naturality condition是必要的。

補:鑑於連haskell是不是parametric都有人質疑: https://

wiki.haskell.org/Polymo

rphism

5樓:

先問是不是,再問為什麼:https://

docs.python.org/3/libra

ry/functools.html#functools.lru_cache

如何用乙個多項式對乙個函式進行放縮?

上路跳跳愛小白 我感覺這個地方有點問題 題主想問的就是去除餘項吧 emmmm,那我們開始 就用上面舉的幾個例子 就是 在 處的切線 就是 在 處的切線 是 在 處的切線 是 在 處的切線 那麼切線放縮的通式 我們講剛剛得到的進行換元,就能得到如下 在數學中,由若干個單項式相加組成的代數式叫做多項式 ...

C 能否設計乙個一般的計時函式?

Cryonyx 題主的意思是這樣?template T measure function time Ret pFunc Args.Args args template T measure function time Ret C pFunc Args.C pC,Args args 不過不支援std f...

能否設計乙個連續函式,使f 1,2,3,4 1,2,3,4。f 5 114514?

luosw 啊又是著名的拉格朗日插值法。拉格朗日插值法可以實現依據現有資料擬合出多項式函式 一定連續 的function。具體的分析見 拉格朗日插值法在數學中的運用 Luosw 的小窩結合上文的內容。即已知 求 由於有 條件,插值會得到一四次的多項式,利用拉格朗日公式可以得到所求的 為 展開可以得到...