【发布时间】:2018-07-31 14:17:12
【问题描述】:
所以我写了这个程序,一切正常;) 我想改进它。我还可以使用 /= 编译两个不同的时间集并获得 True 作为结果。 我有点困惑。
data Time = Localtime {hour, minute :: Int}
| Globaltime {hour, minute, difference :: Int}
| LocaltimeAM {hour, minute :: Int, am :: Bool}
deriving Show
same :: Time -> Time -> Bool
same u1 u2 = (h u1) == (h u2)
where
h :: Time -> (Int, Int) -- (Int, Int) = (hour, minute)
h (Localtime h m) = (h, m)
h (Globaltime h m d) = ((h+d+24) `mod` 24, m)
h (LocaltimeAM h m am) = (h + (if am then 0 else 12), m)
【问题讨论】:
-
我很惊讶这行得通,因为
datatype 需要以 upercase 开头。 -
此外,我还不清楚问题所在。 “使用
/=的两个不同的时间集是什么意思?您可以定义different :: Time -> Time -> Bool,或使其成为Eq的实例。 -
我不想使用 Eq。是的,我可以定义“不同”,但我的问题是是否可以在一个函数中结合不同和相同。
-
“在一个函数中组合不同的和相同的”我不明白你的意思。我假设
different a b的结果与same a b的结果不同,对吧?如果是这样,那么它们一定是两个不同的函数。 -
@BroniaBerlin:是的,添加一个额外的参数来指定你想要“相同”还是“不同”的风格。但标准方法是让
Time成为Eq的实例,这样就可以重用(==)用于各种对象。此外,突然之间,您可以使用像nub这样的函数,其条件是它们num的元素是Eq类型。
标签: haskell algebraic-data-types