1

我有:

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

进而

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

现在我希望能够进行模式匹配以确保给定的术语是颜色,如果是,请检查它的“值”(蓝色/绿色......)。像这样的东西:

func :: Term -> Bag -> Bool
func (c :: Color) bag = (color bag) == c

但是 (c :: Color) 似乎不起作用。

4

2 回答 2

8
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.
于 2009-10-03T21:27:11.550 回答
3

这是一个有点冗长的帐户,我认为与 sdcvvc 的内容没有什么不同。

数据颜色 = 蓝色 | 绿色 | 红色 | 白色 | 黄色导出 (Eq,Ord,Show)
数据大小 = 小 | 中 | 大推导(Eq、Ord、Show)

数据项 = TColor 颜色 | Tsize 尺寸 | 垃圾衍生秀
data Bag = Bag {color :: Color , size :: Size} 推导显示

请注意,与 sdcvvc 不同,我使用了“TColor Color”。没有什么不同,因为类型检查器可以判断一个是已经建立的类型,另一个是新类型的新构造函数,即使它们的拼写相同。它只是不那么令人困惑。如今,像“Color Color”这样的东西并不少见,但在像 Bird 的“Intro to FP with Haskell”这样的老书中,他不会做这种事情。这有点像 Haskeller 对“\file -> readFile file”之类的流行,它有其优点,但可能会令人困惑,而且看起来很新;以前它只是 \x -> readFile x 或其他东西。

撒切尔夫人 :: 包
theMrsThatcher = 包蓝色大号

罗宾逊夫人 :: 包
theMrsRobinson = Bag {color = Green, size = Small} -- 使用其他语法

colorCheck :: Term -> Bag -> Bool
colorCheck (TColor c) b = True
colorCheck (TSize s) b = False - 正如 sdcvvc 所说,这和
colorCheck Trash b = False -- 下一个子句可以替换为
                                -- colorCheck _ _ = 假

另请注意,在colorCheck包中是无关紧要的。从您所说的内容中不清楚为什么需要中间类型 Term。

colorTest :: 颜色 -> 包 -> 布尔
colorTest cb = 颜色 b == c

colorCheckTest :: Term -> Bag -> Bool
colorCheckTest (TColor c) b = 颜色 b == c
colorCheckTest (TSize s) b = False -- 如上所述,最后的子句是
colorCheckTest Trash b = False -- 比需要的更冗长,因为任何  
                                      ——但第一个模式是失败者。

结果:

*Main> colorCheck (TColor Blue) theMrsRobinson  
真的  
*Main> colorCheck (TColor Blue) theMrsThatcher  
真的  
*Main> colorCheckTest (TColor Blue) theMrsRobinson  
错误的  
*Main> colorCheckTest (TColor Blue) TheMrsThatcher  
真的  
*Main> colorTest Blue theMrs Thatcher  
真的  
*Main> colorTest Blue theMrsRobinson  
错误的  
于 2009-10-05T02:57:39.633 回答