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+ 次查看

启动您的职业生涯

通过完成课程获得认证

开始
广告