Performance Haskell/GHC的回忆录是多少?

Performance Haskell/GHC的回忆录是多少?,performance,haskell,functional-programming,ghc,memoization,Performance,Haskell,Functional Programming,Ghc,Memoization,我编写了以下代码来显示Pascal的三角形: import Control.Monad import Data.List pascalRow :: Integer -> [Integer] pascalRow 0 = [1] pascalRow n = map sumParents pairs where previousRow = 0:(pascalRow $ n - 1)++[0] pairs = zip previousRow (tail previousRow

我编写了以下代码来显示Pascal的三角形:

import Control.Monad
import Data.List

pascalRow :: Integer -> [Integer]
pascalRow 0 = [1]
pascalRow n = map sumParents pairs
  where previousRow = 0:(pascalRow $ n - 1)++[0]
        pairs = zip previousRow (tail previousRow)
        sumParents (a, b) = a + b

-- Read an integer from stdin, and print the Pascal triangle of that height.
main = do
  n <- readLn
  forM_ [0..n-1] printRow
    where printRow k = putStrLn $ intercalate " " $ map show $ pascalRow k
import-Control.Monad
导入数据。列表
pascalRow::Integer->[Integer]
帕斯卡罗0=[1]
pascalRow n=映射父对象对
其中previousRow=0:(pascalRow$n-1)+[0]
pairs=zip previousRow(tail previousRow)
(a,b)=a+b
--从stdin读取一个整数,并打印该高度的Pascal三角形。
main=do

n通过将函数与“记忆”过去应用程序的数据结构相关联来记忆函数。Ghc不会记住过去任意的函数应用程序,但它确实记住了它仍然在处理的结构之外的内容。在这种情况下,函数
pascalRow
实际上并不需要:我们只需要描述无限帕斯卡三角形,并根据需要打印出尽可能多的内容

import Control.Monad
import Data.List

pstep :: [Integer] -> [Integer]
pstep xs = zipWith (+) (0:xs) (xs ++ [0])

-- the infinite pascal triangle
pascal = iterate pstep [1] 
pascalRow n = pascal !! n  -- not needed, but fine

-- Read an integer from stdin, 
-- and print that much of the infinite Pascal triangle.
main = do
      n <- readLn
      mapM_ printRow (take n pascal)
  where printRow xs = putStrLn $ intercalate " " $ map show xs
import-Control.Monad
导入数据。列表
pstep::[Integer]->[Integer]
pstep xs=zipWith(+)(0:xs)(xs++[0])
--无限帕斯卡三角形
pascal=迭代pstep[1]
帕斯卡罗n=帕斯卡!!不需要,但很好
--从stdin读取一个整数,
--打印出无穷大的帕斯卡三角形。
main=do

n GHC忘记了。您可以调整
pascalRow
,以获得
nextRow
,其中给定的行n计算行n+1。然后,定义
allRows=iterate nextRow[0]
并重新定义
pascalRow n=allRows!!n
。这样,全局绑定
allRows
中的前几行就不会被丢弃。(您甚至可能希望使用列表以外的东西来更快地进行随机访问…)感谢您的解释(我认为关键是第二句),以及更优雅的实现!