小编Mri*_*ury的帖子

Haskell的`seq`冗余地评估参数?

如果我正确理解这里的讨论,seq不应该两次评估一个值,因为x `seq` x应该评估x一次.

那为什么我有这种行为?

?> :set +s
?> let fib x = if x <= 1 then x else fib (x - 1) + fib (x - 2)
(0.01 secs, 102,600 bytes)
?> fib 30
832040
(2.49 secs, 638,088,448 bytes)
?> let x = fib 30 in x
832040
(2.47 secs, 638,088,792 bytes)
?> let x = fib 30 in x `seq` x
832040
(4.95 secs, 1,276,067,128 bytes)

这显然是双重评估?我误会了什么吗?

编辑:正如下面的@danidiaz所问,我也评估过

? …
Run Code Online (Sandbox Code Playgroud)

performance haskell

14
推荐指数
1
解决办法
177
查看次数

为什么这个尾递归Haskell函数更慢?

我试图实现一个Haskell函数,它将整数A的数组作为输入,并产生另一个数组B = [A [0],A [0] + A [1],A [0] + A [1] + A [2],......].我知道Data.List中的scanl可以用于函数(+).在看到scanl的源代码后,我编写了第二个实现(执行速度更快).我想知道为什么第一个实现比第二个实现慢,尽管是尾递归?

-- This function works slow.
ps s x [] = x
ps s x y  = ps s' x' y'
            where
                s' = s + head y
                x' = x ++ [s']
                y' = tail y

-- This function works fast.
ps' s []   = []
ps' s y    = [s'] ++ (ps' s' y') 
             where 
                s' = s + head y
                y' = tail …
Run Code Online (Sandbox Code Playgroud)

recursion haskell tail-recursion

2
推荐指数
1
解决办法
306
查看次数

clojure何时删除变量?

我正在寻找源头memoize.来自C++/Python等语言,这部分让我很难受: (let [mem (atom {})] (fn [& args] (if-let [e (find @mem args)] ...

我意识到memoize返回一个函数,但是对于存储状态,它使用本地"变量" mem.但是 memoize返回函数之后,不应该从范围消失那个外部.该功能如何仍然可以参考mem.

为什么Clojure不删除该外部变量,以及它如何管理变量名称.就像假设一样,我制作另一个memoized函数,然后memoize使用另一个mem.这个名字与之前的名字没有冲突mem吗?

PS:我当时认为那里肯定会发生一些事情,这会阻止这种情况发生,所以我给自己写了一个更简单的版本,就像http://ideone.com/VZLsJp一样,但仍然有点像memoize.

variables scope clojure memoization

0
推荐指数
1
解决办法
119
查看次数