J'essaie d'implémenter un produit scalaire entre deux listes de nombres en utilisant uniquement des fonctions de la bibliothèque Prelude. J'ai écrit la fonction suivante:Produit scalaire pour les listes dans Haskell
dot :: Num a => [a] -> [a] -> a
dot x y = sum $ zipWith (*) x y
que je l'ai testé comme suit:
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()
Malheureusement, ce code conduit à un dépassement de l'espace de pile pour les listes avec 1 million d'éléments (à l'aide GHC 7.6. 3 et le drapeau d'optimisation -O2).
Pour un cas aussi simple, je m'attendais à ce que ghc puisse effectuer les optimisations nécessaires pour éviter le coût des appels récursifs. Est-ce que je manque quelque chose? Ma mise en œuvre est-elle incorrecte?
Comment les listes sont-elles produites? Cela fonctionne pour moi avec un simple 'repeat 1.0'. –
Le problème ici serait de savoir comment vous produisez les arguments que vous passez à 'dot'. 'dot' lui-même utilise un espace constant. – Alec
Laquelle des trois fonctions est implémentée avec des appels récursifs? –