我試圖在Prelude庫中僅使用函數的兩個數字列表之間實現一個點積。我寫了下面的功能:針對Haskell中的列表的點積產品
dot :: Num a => [a] -> [a] -> a
dot x y = sum $ zipWith (*) x y
我測試如下:
main :: IO()
main = do
let n = 10^6
x = (replicate n 2.0) :: [Double]
y = (replicate n 3.0) :: [Double]
print $ dot x y
return()
不幸的是,這個代碼導致堆棧溢出的空間用於名單100萬件(GHC使用7.6。 3和優化標誌-O2)。
對於這樣一個簡單的例子,我希望ghc能夠執行必要的優化以避免遞歸調用的代價。我錯過了什麼嗎?我的執行錯誤?
列表如何生成?這適用於我的一個簡單的'重複1.0'。 –
這裏的問題是你如何產生你傳遞給'dot'的參數。 'dot'本身使用不變的空間。 – Alec
這三個函數中的哪一個是通過遞歸調用實現的? –