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 函式在列舉值及其對應的整數之間進行轉換。