【问题标题】:Stream data type implementation in HaskellHaskell 中的流数据类型实现
【发布时间】:2021-06-12 15:48:16
【问题描述】:

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

data Stream a = a :> Stream a

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

streamToList :: Stream a -> [a]

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

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

【问题讨论】:

    标签: haskell stream algebraic-data-types custom-data-type


    【解决方案1】:

    您已将数据类型定义为

    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
    

    (这些函数有哪些类型?)

    【讨论】:

    • 很高兴能提供帮助。 :)
    【解决方案2】:

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

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

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

    这里x 是流的第一个项目,xs 是项目的Stream

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

    【讨论】:

      猜你喜欢
      • 2021-05-04
      • 1970-01-01
      • 2016-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-30
      • 1970-01-01
      • 2018-11-29
      相关资源
      最近更新 更多