模式匹配列表中第一个元素的数据类型

时间:2018-03-30 16:25:16

标签: haskell

我正在尝试在此处执行以下操作

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中实现这一目标的最佳方法是什么?

1 个答案:

答案 0 :(得分:3)

答案只是“更多模式匹配”。我认为你在一种类型和另一种类型的构造函数之间感到困惑。

M类型有三个构造函数ABC。在尝试对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