两种流类型之间的转换

时间:2016-12-12 03:21:03

标签: haskell type-conversion isomorphism

我有一个关于在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类型。我知道有一个类似于时间的问题

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

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

1 个答案:

答案 0 :(得分:6)

  

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

是的!

  

以及我如何创建流

递归! 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. 第二个构造函数参数的类型
  5. 您在编写转化时可以忽略记录语法。

    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