我正在尝试在此处执行以下操作
data M = A DataA | B DataB | C deriving (Eq, Show)
data DataA = DataA {aInt::Int} deriving (Eq, Show)
data DataB = DataB {bInt::Int} deriving (Eq, Show)
myFunction :: [M] -> Int
myFunction [] = 0
myFunction (m:rest) =
-- if m is A doSomething1
-- if m is B doSomething2
-- if m is C doSomething3
我可以匹配C的类型,但不能匹配其他两种。
我尝试过像
这样的事情myFunction ((DataA m):rest) = doSomething1
myFunction ((A m):rest) = doSomething1
myFunction ((m::DataA):rest) = doSomething1
myFunction ((m::A):rest) = doSomething1
myFunction (m:rest) = case m of A -> doSomething1
B -> doSomething2 --etc
没有运气。在Haskell中实现这一目标的最佳方法是什么?
答案 0 :(得分:3)
答案只是“更多模式匹配”。我认为你在一种类型和另一种类型的构造函数之间感到困惑。
M
类型有三个构造函数A
,B
和C
。在尝试对Data{A,B}
构造函数进行模式匹配之前,您应匹配其中一个以获取字段(如果有)。
data M = A DataA | B DataB | C deriving (Eq, Show)
data DataA = DataA {aInt::Int} deriving (Eq, Show)
data DataB = DataB {bInt::Int} deriving (Eq, Show)
myFunction :: [M] -> Int
myFunction [] = 0
myFunction (m:rest) =
case m of
A (DataA a) -> a
B (DataB b) -> b
C -> myFunction rest