我在研究功能反应式编程时发现了这一说法,来自Hai Liu和Paul Hudak的"用箭头堵塞空间泄漏"(第5页):
Run Code Online (Sandbox Code Playgroud)Suppose we wish to de?ne a function that repeats its argument inde?nitely: repeat x = x : repeat x or, in lambdas: repeat = ?x ? x : repeat x This requires O(n) space. But we can achieve O(1) space by writing instead: repeat = ?x ? let xs = x : xs in xs
这里的差异似乎很小,但它极大地促进了空间效率.为什么以及如何发生?我做的最好的猜测是手工评估它们:
r = \x -> x: r x
r 3
-> 3: r 3
-> 3: 3: 3: …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个接受整数的函数,并将mPascal三角形的行返回到该m行.
我已经构造了一个choose函数,它接受两个整数n和k,并返回值n选择k.例如,choose 3 2返回3.
到目前为止,我有
pascal 0 = [1]
pascal m = [x | x <- pascal (m-1)] ++ [choose m k | k <- [0,1..m]
Run Code Online (Sandbox Code Playgroud)
这是返回一个大的列表,但实际上,我想要一个列表列表,其中每个列表对应于Pascal三角形中的一行.例如pascal 3应该返回[[1],[1,1],[1,2,1],[1,3,3,1]].它目前正在回归[1,1,1,1,2,1,1,3,3,1].