Haskell中的模式匹配数据类型及其嵌套名称

Haskell中的模式匹配数据类型及其嵌套名称,haskell,types,pattern-matching,Haskell,Types,Pattern Matching,我有: 然后 data Color = Blue | Green | Red | White | Yellow deriving (Eq,Ord) 现在我希望能够进行模式匹配,以确保给定的术语是颜色,如果是,则检查其“值”(蓝色/绿色…)。大概是这样的: data Term = Color | ... data Bag = Bag { color :: Color ... } 但是(c::颜色)似乎不起作用 这是一个比较冗长的账户,我认为它的内容与sdcvvc没有什么不同 func :: T

我有:

然后

data Color = Blue | Green | Red | White | Yellow deriving (Eq,Ord)
现在我希望能够进行模式匹配,以确保给定的术语是颜色,如果是,则检查其“值”(蓝色/绿色…)。大概是这样的:

data Term = Color | ...
data Bag = Bag {
color :: Color
...
}

但是(c::颜色)似乎不起作用

这是一个比较冗长的账户,我认为它的内容与sdcvvc没有什么不同

func :: Term -> Bag -> Bool
func (c :: Color) bag = (color bag) == c
data Color = Blue | Green | Red | White | Yellow deriving (Eq,Ord)

data Term = Color Color | Trash

data Bag = Bag {
  color :: Color
}

func (Color x) bag = (color bag) == x

-- With the above, a call of func Trash something will fail.
-- (unexhastive pattern match). You can add

func Trash bag = False

-- or

func _ _ = False

-- and it will work all time.
结果:

colorTest :: Color -> Bag -> Bool colorTest c b = color b == c colorCheckTest :: Term -> Bag -> Bool colorCheckTest (TColor c) b = color b == c colorCheckTest (TSize s) b = False -- as above, the last clauses are colorCheckTest Trash b = False -- wordier than need be since any -- but the first pattern is a loser. *Main>colorCheck(t颜色蓝色)theMrsRobinson 真的 *Main>colorCheck(t彩色蓝色)ThermsThatcher 真的 *Main>colorCheckTest(t颜色蓝色)theMrsRobinson 假的 *Main>colorCheckTest(t彩色蓝色)ThermsThatcher 真的 *Main>colorTest蓝色主题撒切尔 真的 *Main>colorTest蓝色Themmrsrobinson 假的
这是一个比较冗长的描述,我认为它的内容与sdcvvc的没有什么不同

data Color = Blue | Green | Red | White | Yellow deriving (Eq,Ord)

data Term = Color Color | Trash

data Bag = Bag {
  color :: Color
}

func (Color x) bag = (color bag) == x

-- With the above, a call of func Trash something will fail.
-- (unexhastive pattern match). You can add

func Trash bag = False

-- or

func _ _ = False

-- and it will work all time.
结果:

colorTest :: Color -> Bag -> Bool colorTest c b = color b == c colorCheckTest :: Term -> Bag -> Bool colorCheckTest (TColor c) b = color b == c colorCheckTest (TSize s) b = False -- as above, the last clauses are colorCheckTest Trash b = False -- wordier than need be since any -- but the first pattern is a loser. *Main>colorCheck(t颜色蓝色)theMrsRobinson 真的 *Main>colorCheck(t彩色蓝色)ThermsThatcher 真的 *Main>colorCheckTest(t颜色蓝色)theMrsRobinson 假的 *Main>colorCheckTest(t彩色蓝色)ThermsThatcher 真的 *Main>colorTest蓝色主题撒切尔 真的 *Main>colorTest蓝色Themmrsrobinson 假的
这似乎是初学者常见的误解:名为
Color
(来自
data Color
)的类型和名为
Color
(来自
data Term=Color
)的构造函数完全不相关,在完全不同的名称空间中。@ephemien我会接受这个答案。这似乎是初学者常见的误解:名为
Color
(来自
data Color
)的类型和名为
Color
(来自
data Term=Color
)的构造函数完全不相关,在完全不同的名称空间中,@ephemien我会接受这个答案。 *Main> colorCheck (TColor Blue) theMrsRobinson True *Main> colorCheck (TColor Blue) theMrsThatcher True *Main> colorCheckTest (TColor Blue) theMrsRobinson False *Main> colorCheckTest (TColor Blue) theMrsThatcher True *Main> colorTest Blue theMrsThatcher True *Main> colorTest Blue theMrsRobinson False