有沒有什麼辦法可以強制GHC在特定值的生命週期內對特定計算進行thunk操作?Haskell中是否存在任何隱式存儲?
我很明顯可以將值放入記錄中,爲所述計算的結果創建惰性記錄條目,並創建一個製造函數,該函數構建記錄並將值轉換爲所述條目。
我討厭需要從記錄中拉出原始值,但每次我都需要它。 Haskell並沒有像C++或Java這樣的關係。
是否有任何技巧用於記憶具有相同參數的函數的多個不相關調用的值?
我可以隱約想象各種形式的依賴類型的技巧會有效地告訴編譯器多種用法即將到來。 Haskell中沒有任何依賴類型,但可能是隱含參數的東西?我想不是,但我想我會問。也許是一個編譯指示?
想象我已經針對我需要得到的有理數的矢量,存儲爲公分母和numerators的矢量Necklace
數據結構的載體。
{-# LANGUAGE ImplicitParams #-}
import qualified Data.Vector as V
data Necklace = Necklace { ... }
necklace_length n = ...
denominator :: (necklaces :: V.Vector Necklace) => Int
denominator = V.foldl' lcm 30 $ V.map necklace_length ?necklaces
numerators :: (necklaces :: V.Vector Necklace) => V.Vector Int
numerators = V.map f ?necklaces
where f x = ... denominator ...
kittytoy :: (necklaces :: V.Vector Necklace) => Meow -> ...
kittytoy = \meow -> ... numerators ...
先驗,我期望的是,如果我調用kittytoy
數百萬次,每次用不同的參數meow
,然後GHC產生調用numerators
一百萬次,每次用相同的隱式參數necklaces
代碼。
然而很明顯numerators
只需要調用一次,但第一次被分配的時候?necklaces
,這意味着GHC可能會注意到這種優化。
甚至應該有一個明確的代碼重構方法,使用模板haskell通過生成代碼?numerators = numerators
以及添加numerators :: V.Vector Int
來鍵入調用它的函數的約束來顯式傳遞thunk。
'kittytoy necklaces = let n = numerators項鍊在\ meow - > stuff'絕對應該記憶'n'。不知道它是否也會如此。 – yairchu 2012-04-06 21:24:21
你的意思是'讓k = kittytoy在''用'k'替換對'kittytoy'的每個調用?是的,我同意應該記憶隱式參數'?necklaces',但是我真的需要這麼做嗎? – 2012-04-06 21:27:00
啊,不,我試圖在'* kittytoy'的調用之外記錄'numerators' *,因爲'kittytoy'本身被調用了幾百萬次。是的,這是一個有效的觀點,'kittytoy'應該是一個lambda表達式,無論如何,爲了清晰起見,我會對其進行編輯。 – 2012-04-06 21:29:24