我正在编写一个函数,它接受日期列表并计算为(Int,Int,Int)。如果列表为空,则计算结果为Nothing,并计算为Just d,其中d是列表中最早的Date。我的日期数据结构如下:
data Date = Date Int Int Int
deriving (Show)
这是一个帮助函数,用于确定日期是否较旧:
isOlder2 :: Date -> Maybe Date -> Bool
isOlder2 (Date x y z) (Just (Date a b c))
| x < a = True
| x > a = False
| (x == a)&&(y < b) = True
| (x == a)&&(y > b) = False
| (x == a) && (y ==b) &&(z < c) =True
| (x == a) && (y ==b) &&(z > c) = False
| (x == a) && (y ==b) &&(z == c) = False
我的实际方法是最老的,如下:
oldest :: [Date] -> Maybe Date
oldest [] = Nothing
oldest (x : xs)
| isOlder2 x oldestTail = Just x
| otherwise = oldestTail
where oldestTail = oldest xs
我认为问题出现在Maybe中,但我不熟悉结构及其工作原理。有什么想法吗?
答案 0 :(得分:5)
当这里的第二个参数是Nothing
时会发生什么?:
isOlder2 :: Date -> Maybe Date -> Bool
isOlder2 (Date x y z) (Just (Date a b c)) = ...
要求ghci告诉我们Maybe
类型:
*Main> :info Maybe
data Maybe a = Nothing | Just a -- Defined in ‘GHC.Base’
这告诉我们Maybe Date
类型的值可以是Nothing
或Just (Date ...)
。因此,您需要添加另一个等式来处理Nothing
情况:
isOlder2 (Date x y z) Nothing = ...