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中的某个地方,但我不熟悉结构及其工作原理.有什么想法吗?
当这里的第二个参数是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
可以是Nothing
或Just (Date ...)
.所以你需要添加另一个方程来处理这个Nothing
案例:
isOlder2 (Date x y z) Nothing = ...
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
224 次 |
最近记录: |