【问题标题】:Conversion between two stream types两种流类型之间的转换
【发布时间】:2016-12-12 03:21:03
【问题描述】:

我有一个关于在 Haskell 中转换两种数据类型的问题。

考虑以下两种数据类型

data Stream a = Cons a (Stream a)

data Stream2 a = ST {shead :: a, stail :: Stream2 a}

Q2:写

sToS2 :: Stream a -> Stream2 a

s2ToS :: Stream2 a -> Stream a

在流的两种表示之间进行转换

我遇到的第一件事是 Stream 数据类型,我们可以看到这是一个递归数据类型,但没有基本情况,这让我想知道这是否是无限的,以及我如何去创建一个流数据类型。此外,Stream2 的构造函数以记录语法给出,其中字段之一也是 Stream2 类型。我知道有一个类似于 time where 的问题

data Ab = A | B
data Cd = C | D

fromAb :: Ab -> Cd
fromAb A = C
fromAb B = D

toAb :: Cd -> Ab
toAb C = A
toAb D = B

但我不确定如何将这个问题的答案应用于我的特殊困惑。

【问题讨论】:

    标签: haskell type-conversion isomorphism


    【解决方案1】:

    没有基本情况,这让我想知道这是否是无限的

    是的!

    以及如何创建流

    递归! Haskell 是非严格的,所以这没问题。看:

    successors :: Num a => a -> Stream a
    successors start = Cons start $ successors $ start + 1
    
    λ> case successors 1 of Cons _ (Cons _ (Cons x _)) -> x
    3
    

    Stream2 的构造函数以记录语法给出,其中字段之一也是 Stream2 类型

    确实如此。除了使用记录糖之外,Stream2 类型与Stream 相同(或者更准确地说,同构)。我们可能会稍微排列一下,以使相似之处在视觉上更加明显:

    data Stream  a = Cons            a           (Stream  a)
    data Stream2 a = ST   { shead :: a, stail ::  Stream2 a }
    --   [  1  ]     [ 2 ]          [3]           [   4   ]
    
    1. 类型
    2. 类型的唯一构造函数
    3. 第一个构造函数参数的类型
    4. 第二个构造函数参数的类型

    您可以在编写转换时忽略记录语法。

    sToS2 :: Stream  a -> Stream2 a
    s2ToS :: Stream2 a -> Stream  a
    
    sToS2 (Cons x xs) = ST   x $ sToS2 xs
    s2ToS (ST   x xs) = Cons x $ s2ToS xs
    

    【讨论】:

    • 感谢您的回复,我正在尝试实现两个函数 sToS2 :: Stream a -> Stream2 a s2ToS :: Stream2 a -> Stream a 它在两种数据类型之间转换的位置.
    • @Maxtwelve 我知道,这个答案正在进行中。查看最新编辑。
    • 感谢您的回复,Cons运算符可以用于非列表的数据类型吗?是否可以像在 x 是头部和 xs 是 Stream 数据类型的尾部一样读取它?
    • 对不起,我不明白这个问题。
    猜你喜欢
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多