【发布时间】:2022-01-15 21:29:03
【问题描述】:
我有这些功能的代码:
- 从给定的流中创建一个无限列表;
- 为给定的迭代函数和起始流元素(种子)创建一个流;
- 将两个流合并为一个,以便它们的元素交错。
代码如下:
data Stream a = Cons a (Stream a)
streamToList :: Stream a -> [a]
streamToList (Cons x xs) = x : streamToList xs
streamIterate :: (a -> a) -> a -> Stream a
streamIterate f x = Cons x (streamIterate f (f x))
streamIterLeave :: Stream a -> Stream a -> Stream a
streamIterLeave (Cons x xs) ys = Cons x (streamIterLeave ys xs)
现在我遇到的问题是我不知道如何在 ghci 上检查此代码。具体来说,如何在命令行中输入流?
例如我试过streamToList [1,2,3]; streamToList (1,2,3); streamToList 1,2,3 并且它们似乎都没有工作。
非常感谢您的帮助!
【问题讨论】:
-
你不能构造一个有限的流,因为你没有空的情况。因此,您不能像
Cons 'a' (Cons 'b' (...))那样手动构建一个。但是,您可以依赖无限递归:foo i = Cons i (foo $ i + 1)。 -
你可以试试
s1 = streamIterate (+2) 0,s2 = streamIterate (+2) 1,然后take 20 $ streamToList s1,同样的s2,甚至take20 $ streamToList $ streamInterleave s1 s2。 -
请注意,您的任何尝试都不会构造
Stream值;您分别有列表、元组和语法错误。构造Stream值的唯一方法是使用Cons,因此(co)recuson 是必要的。 -
@IvenMarquardt 人们往往会忘记
undefined。 :)take 2 $ streamToList $ Cons 1 $ Cons 2 undefined有效。
标签: haskell functional-programming stream read-eval-print-loop ghci