假设我们定义了一个名为 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
。