问题描述
我在我的大学开设了 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
是流的第一项,xs
是 Stream
项。
我将实现子句的主体(…
部分)作为练习。您将需要递归来“遍历”流的其余部分。