这是一个有点冗长的帐户,我认为与 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
错误的