我有一个关于在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
但我不确定如何将这个问题的答案应用到我特别的困惑中。
答案 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 ]
您在编写转化时可以忽略记录语法。
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