[英]Conversion between two stream types
我有一個關於在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數據類型,我們可以看到這是一個遞歸數據類型,但是沒有基本情況,這使我想知道這是否是無限的,以及如何創建一個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
但是我不確定如何將這個問題的答案應用於我的特殊困惑。
沒有基本情況,這使我想知道這是否是無限的
它是!
以及如何創建流
遞歸! 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.