gpt4 book ai didi

haskell - Haskell 列表的点积

转载 作者:行者123 更新时间:2023-12-02 17:15:42 25 4
gpt4 key购买 nike

我正在尝试仅使用 Prelude 库中的函数在两个数字列表之间实现点积。我编写了以下函数:

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 能够执行必要的优化以避免递归调用的成本。我错过了什么吗?我的实现有误吗?

最佳答案

sum 是(曾经)用 foldr 实现的。对于Num大多数 实例来说,这是一个有点愚蠢的选择;严格的左折更好。使用

import Data.List

sum' :: Num a => [a] -> a
sum' = foldl' (+) 0

相反,您的堆栈溢出将消失。

关于haskell - Haskell 列表的点积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46637781/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com