-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMovieReview.hs
43 lines (36 loc) · 1.41 KB
/
MovieReview.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import Control.Monad(ap)
ex = [("name", Just "Attila \"The Hun\""),
("occupation", Just "Khan")]
data MovieReview = MovieReview {
revTitle :: String
, revUser :: String
, revReview :: String
}
dumbReview :: [(String, Maybe String)] -> Maybe MovieReview
dumbReview alist =
case lookup "title" alist of
Just (Just title@(_:_)) ->
case lookup "user" alist of
Just (Just user@(_:_)) ->
case lookup "review" alist of
Just (Just review@(_:_)) ->
Just (MovieReview title user review)
_ -> Nothing
_ -> Nothing
_ -> Nothing
betterReview :: [(String, Maybe String)] -> Maybe MovieReview
betterReview alist = do
Just user@(_:_) <- lookup "user" alist
Just title@(_:_) <- lookup "title" alist
Just review@(_:_) <- lookup "review" alist
return $ MovieReview title user review
lookup1 key alist = case lookup key alist of
Just (Just s@(_:_)) -> Just s
_ -> Nothing
liftedReview alist = liftM3 MovieReview (lookup1 "title" alist)
(lookup1 "user" alist)
(lookup1 "review" alist)
apReview alist =
MovieReview `liftM` lookup1 "title" alist
`ap` lookup1 "user" alist
`ap` lookup1 "review" alist