【发布时间】:2014-12-29 05:42:06
【问题描述】:
我已经制作了一种应该模拟“流”的类型。这基本上是一个没有记忆的列表。
data Stream a = forall s. Stream (s -> Maybe (a, s)) s
基本上一个流有两个元素。一个状态s,以及一个接受该状态并返回一个a 类型的元素和新状态的函数。
我希望能够对流执行操作,因此我导入了Data.Foldable 并在其上定义了流:
import Data.Foldable
instance Foldable Stream where
foldr k z (Stream sf s) = go (sf s)
where
go Nothing = z
go (Just (e, ns)) = e `k` go (sf ns)
为了测试我的流的速度,我定义了以下函数:
mysum = foldl' (+) 0
现在我们可以比较普通列表的速度和我的流类型:
x1 = [1..n]
x2 = Stream (\s -> if (s == n + 1) then Nothing else Just (s, s + 1)) 1
--main = print $ mysum x1
--main = print $ mysum x2
我的流大约是列表速度的一半(完整代码here)。
此外,这是最好的情况,没有列表或流:
bestcase :: Int
bestcase = go 1 0 where
go i c = if i == n then c + i else go (i+1) (c+i)
这比列表和流版本都快很多。
所以我有两个问题:
- 如何让我的流版本至少与列表一样快。
- 如何让我的流版本接近
bestcase的速度。
【问题讨论】:
标签: performance haskell stream pipeline fold