Haskell 中的流数据类型实现

问题描述

我在我的大学开设了 Haskell 编程课程。我必须实现我自己的数据类型“Stream”及其一些功能:

data Stream a = a :> Stream a

我在实现函数“streamToList”时遇到问题:

streamToList :: Stream a -> [a]

它必须接受一个“Stream”对象并返回一个无限列表。但我不知道如何获取这个对象的元素。如何获取此流的元素?

另外,我想问一下:这个数据类型的对象有什么方法可以初始化?

解决方法

您已将数据类型定义为

data Stream a = a :> Stream a

这是一个模式,一个如何使用的模板。 “使用”意味着创建访问。换句话说,互动

可以使用定义中 = 左侧的模式访问这种类型的值,

foo (a :> restOfAs) = a : foo restOfAs

(这个函数的类型是什么?)

可以创建这种类型的值,将其用作定义中 = 右侧的代码模式,例如

bar i = i :> bar (i+1)

baz [x]    = x :> baz [x]
baz (x:xs) = x :> baz xs
baz []     = error "can't be empty"

quux x = xs  where  
         xs = x :> xs

(这些函数的类型是什么?)

,

它必须接受一个“Stream”对象并返回一个无限列表。但是我不知道如何取这个对象的元素。

通过模式匹配,您可以“解包”包装在数据构造函数中的数据,例如:

streamToList :: Stream a -> [a]
streamToList (x :> xs) = …

此处 x 是流的第一项,xsStream 项。

我将实现子句的主体( 部分)作为练习。您将需要递归来“遍历”流的其余部分。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...