【发布时间】:2017-08-16 19:59:24
【问题描述】:
我正在尝试在 Haskell 中实现功能性反应流。我有一个相当简单的定义:
data Observer a = Observer { next :: a -> IO () }
data Stream a = Stream { subscribe :: Observer a -> IO () }
instance Functor Stream where
fmap = mapStream
mapStream :: (a -> b) -> Stream a -> Stream b
mapStream f Stream{ subscribe=s } = Stream {
subscribe = \Observer{ next=n } -> s Observer{ next = \a -> n $ f a }
}
fromArray :: [a] -> Stream a
fromArray arr = Stream {
subscribe = \Observer{ next=n } -> forM_ arr n
}
这对于像上面的fmap 这样的简单运算符非常有效。我的问题是我将如何为此实施foldStream?我无法更改值,因此我将不得不使用新的种子值递归调用 foldStream。但我不知道如何在这种情况下做到这一点。这甚至可以通过我的简单定义实现,还是我需要一些不同的东西?谢谢。
【问题讨论】:
-
foldStream会有什么类型? -
大概是
foldStream :: (a -> b -> b) -> b -> Stream a -> Stream b -
就像数组的折叠:
foldStream :: (b -> a -> b) -> b -> Stream a -> Stream b