【发布时间】:2018-07-25 00:28:46
【问题描述】:
monad 的各种实例模拟不同类型的效果:例如,Maybe 模拟偏心,List 非确定性,Reader 只读状态。我想知道对于流数据类型(或无限列表或共同列表)的 monad 实例是否有如此直观的解释,data Stream a = Cons a (Stream a)(见下文其 monad 实例定义)。我偶然发现了 few different occasions 上的流单子,我想更好地了解它的用途。
data Stream a = Cons a (Stream a)
instance Functor Stream where
fmap f (Cons x xs) = Cons (f x) (fmap f xs)
instance Applicative Stream where
pure a = Cons a (pure a)
(Cons f fs) <*> (Cons a as) = Cons (f a) (fs <*> as)
instance Monad Stream where
xs >>= f = diag (fmap f xs)
diag :: Stream (Stream a) -> Stream a
diag (Cons xs xss) = Cons (hd xs) (diag (fmap tl xss))
where
hd (Cons a _ ) = a
tl (Cons _ as) = as
P.S.:我不确定我的语言是否非常精确(尤其是在使用“效果”这个词时),请随时纠正我。
【问题讨论】:
-
它模拟无限计算,您可以在其中观察计算的各个步骤。
标签: list haskell stream monads