假设我们定义了一个名为 Stuff 的数据:

data Stuff = Stuff1 Int
           | Stuff2 Int
           | Stuff3 Int

sumStuff :: [Stuff] -> Int
sumStuff [] = 0
sumStuff ((Stuff1 x):xs) = x + sumStuff xs
sumStuff ((Stuff2 x):xs) = x + sumStuff xs
sumStuff ((Stuff3 x):xs) = x + sumStuff xs

sumStuff' :: [Stuff] -> Int
sumStuff' [] = 0
sumStuff' ((_ x):xs) = x+sumStuff xs

如何在没有模式匹配的情况下匹配所有类型,例如 sumStuff' 中的错误定义?

先感谢您!

最佳答案

如果您的数据结构与您的示例一样同质,您可以对数据结构采取不同的方法:

data StuffType = Stuff1 | Stuff2 | Stuff3 deriving (Eq, Show)

data Stuff a = Stuff StuffType a deriving (Eq, Show)

extractStuff :: Stuff a -> a
extractStuff (Stuff _ a) = a

sumStuff :: Stuff Int -> Int
sumStuff = sum . map extractStuff

我什至使包含在 Stuff 中的值是多态的,以防您想在其中存储 String 或更多 Stuff 。这种方法允许您在需要时对 StuffType 进行模式匹配,但在不需要时坚持使用单个模式案例。

您还可以使用记录来定义它以完全避免模式匹配:
data Stuff a = Stuff { stuffType :: StuffType, extractStuff :: a } deriving (Eq, Show)

sumStuff 将具有相同的定义,但您不需要手动定义 extractStuff

10-07 19:59