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