【发布时间】:2015-08-16 06:20:57
【问题描述】:
我是一个 Haskell 新手,在理解 seq 时遇到问题,我在下面的示例中对此进行了总结。
这是相同(愚蠢)功能的 2 个实现。该函数采用正整数 n 并返回元组 (n,n)。答案是通过使用带有元组累加器的辅助函数从 (0,0) 向上计数产生的。为了避免建立一个大的 thunk,我使用了 seq 来使累加器变得严格。
在testSeq1 中,元组的内容是严格的,而在testSeq2 中,元组本身是严格的。我认为这两种实现会执行相同的操作。但实际上,testSeq1 的“使用总内存”仅为 1MB,而testSeq2 则为 187MB(使用 n = 1000000 进行测试时)。
testSeq2 有什么问题?
testSeq1 :: Int -> (Int,Int)
testSeq1 n = impl n (0,0) where
impl 0 (a,b) = (a,b)
impl i (a,b) = seq a $ seq b $ impl (i-1) (a+1, b+1)
testSeq2 :: Int -> (Int,Int)
testSeq2 n = impl n (0,0) where
impl 0 acc = acc
impl i acc = seq acc $ impl (i-1) ((fst acc)+1, (snd acc)+1)
【问题讨论】:
标签: haskell