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

Vic*_*Vic 0 haskell design-patterns maybe

我正在编写一个函数,它接受日期列表并计算(Int,Int,Int).如果列表为空,则计算结果为Nothing,并计算为Just d,其中d是列表中最早的Date.我的日期数据结构如下:

data Date = Date Int Int Int
 deriving (Show)
Run Code Online (Sandbox Code Playgroud)

这是一个帮助函数,我用它来确定Date是否更旧:

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 
Run Code Online (Sandbox Code Playgroud)

而我的实际方法,最古老的,如下:

oldest :: [Date] -> Maybe Date 
oldest [] = Nothing
oldest (x : xs)
  | isOlder2 x oldestTail = Just x
  | otherwise = oldestTail 
    where oldestTail = oldest xs
Run Code Online (Sandbox Code Playgroud)

我认为这个问题在Maybe中的某个地方,但我不熟悉结构及其工作原理.有什么想法吗?

jbe*_*man 5

当这里的第二个参数是Nothing什么时会发生什么?:

isOlder2 :: Date -> Maybe Date -> Bool
isOlder2 (Date x y z) (Just (Date a b c)) = ...
Run Code Online (Sandbox Code Playgroud)

要求ghci告诉我们Maybe类型:

*Main> :info Maybe
data Maybe a = Nothing | Just a     -- Defined in ‘GHC.Base’
Run Code Online (Sandbox Code Playgroud)

这告诉我们类型的值Maybe Date可以是NothingJust (Date ...).所以你需要添加另一个方程来处理这个Nothing案例:

isOlder2 (Date x y z) Nothing = ...
Run Code Online (Sandbox Code Playgroud)