Haskell 列舉迭代程式


在 Haskell 中,列舉(或“enum”)是一種具有有限值集的型別。這些值稱為建構函式,通常使用 data 關鍵字定義。

以下是一個表示四個季節的列舉型別的示例:

data Season = Spring | Summer | Fall | Winter

列舉用於表示具有固定可能值集的狀態、模式或選項。

方法一:迭代列舉型別

此方法用於直接迭代 Haskell 中的列舉型別。在這裡,我們定義所有列舉值的列表。建立用於顯示值的例項。迭代列表後,顯示每個輸出值。

演算法

  • 步驟 1 - 定義顏色的資料型別。

  • 步驟 2 - 定義所有列舉值的列表。

  • 步驟 3 - 建立顏色的 Show 例項。

  • 步驟 4 - 程式執行將從 main 函式開始。main() 函式控制整個程式。正在迭代列表。

  • 步驟 5 - 對映顏色並列印最終輸出。

示例

在下面的示例中,我們將迭代列舉型別

data Color = Red | Blue | Green
colors :: [Color]
colors = [Red, Blue, Green]
instance Show Color where
   show Red = "Red"
   show Blue = "Blue"
   show Green = "Green"
main :: IO ()
main = mapM_ print colors   

輸出

Red
Blue
Green

方法二:使用列表推導式在 Haskell 中迭代列舉

在此方法中,data Color = Red | Blue | Green deriving (Show) 定義了一個具有三個建構函式的列舉型別 Color:Red、Blue 和 Green,並使用 mapM_ print [Red .. Green] 迭代 Color 型別的值,依次列印“Red”、“Blue”、“Green”。

這裡,enumFromTo 函式被定義為僅適用於 Red 到 Green 的範圍。

演算法

  • 步驟 1 - 列舉定義了三個建構函式:Red、Blue 和 Green。

  • 步驟 2 - 使用 toEnum、fromEnum、succ 和 pred 建立 Enum 例項。

  • 步驟 3 - 使用 enumFromTo 迭代定義範圍內的列舉。

  • 步驟 4 - 程式執行將從 main 函式開始。main() 函式控制整個程式。

  • 步驟 5 - 使用 mapM_ print [Red .. Green] 語句依次顯示最終輸出。

示例

以下示例顯示瞭如何在 Haskell 中使用列表推導式迭代列舉

data Color = Red | Blue | Green deriving (Show)
instance Enum Color where
   toEnum 0 = Red
   toEnum 1 = Blue
   toEnum 2 = Green
   toEnum _ = error "Invalid color"
   fromEnum Red = 0
   fromEnum Blue = 1
   fromEnum Green = 2
   succ Red = Blue
   succ Blue = Green
   succ Green = Red
   pred Blue = Red
   pred Green = Blue
   pred Red = Green
   enumFromTo Red Green = [Red, Blue, Green]
   enumFromTo _ _ = error "Invalid range"
main :: IO ()
main = mapM_ print [Red .. Green]

輸出

Red
Blue
Green

方法三:使用 iterate 和 take 迭代列舉型別。

在此方法中,將透過將 nextSeason 函式應用於 Red 的初始值 3 次,然後使用 mapM_ print 列印每個結果,來迭代 Color 型別。iterate 函式透過重複將 nextSeason 函式應用於初始值來建立一個無限的值列表。然後使用 take 函式獲取此列表的前 3 個值。

演算法

  • 步驟 1 - 列舉定義了三個建構函式:Red、Blue 和 Green。

  • 步驟 2 - 在顏色建構函式上定義 nextSeason 函式。

  • 步驟 3 - 程式執行將從 main 函式開始。main() 函式控制整個程式。正在迭代列舉。

  • 步驟 4 - 使用 Parent1 和 Parent2 函式作為引數呼叫子類例項。

  • 步驟 5 - 使用 mapM_ print (take 3 (iterate nextSeason Red)) 語句依次顯示最終輸出。

示例

在此示例中,我們將學習如何使用 iterate 和 take 迭代列舉型別。

data Color = Red | Blue | Green deriving (Show)
nextSeason :: Color -> Color
nextSeason Red = Blue
nextSeason Blue = Green
nextSeason Green = Red
main :: IO ()
main = mapM_ print (take 3 (iterate nextSeason Red))

輸出

Red
Blue
Green

結論

在 Haskell 中,列舉(或“enum”)是一種具有有限值集的型別。這些值稱為建構函式,通常使用 data 關鍵字定義。

要迭代列舉型別,可以使用 mapM_、forM_、enumFromTo、iterate 和 take 等函式的組合。您還可以使用 toEnum 和 fromEnum 函式在列舉值及其對應的整數之間進行轉換。

更新於:2023年1月19日

2K+ 次檢視

啟動您的職業生涯

透過完成課程獲得認證

開始
廣告