簡體   English   中英

兩種流類型之間的轉換

[英]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   ]
  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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM