Haskell在Maybe中函数错误的非详尽模式?

时间:2017-06-02 19:41:29

标签: haskell design-patterns maybe

我正在编写一个函数,它接受日期列表并计算为(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中,但我不熟悉结构及其工作原理。有什么想法吗?

1 个答案:

答案 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类型的值可以是NothingJust (Date ...)。因此,您需要添加另一个等式来处理Nothing情况:

isOlder2 (Date x y z) Nothing = ...