1

我有一个关于在 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

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

4

1 回答 1

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. 第二个构造函数参数的类型

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

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
于 2016-12-12T03:33:01.710 回答