aboutsummaryrefslogtreecommitdiff
path: root/challenge-338/deadmarshal/haskell/ch2.hs
blob: c42ea728ae6636f43bdc5ccaaf37cb2b5e7a5178 (plain)
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
module Ch2 where

minmax :: Ord a => [a] -> (Maybe a,Maybe a)
minmax [] = (Nothing,Nothing)
minmax [x] = (Just x,Just x)
minmax (x:y:xs)
  | x < y = let (minVal,maxVal) = minmax (x:xs)
            in (minVal, max (Just y) maxVal)
  | otherwise = let (minVal,maxVal) = minmax (y:xs)
                in (minVal, max (Just x) maxVal)

maxDistance :: (Ord a, Num a) => [a] -> [a] -> Maybe a
maxDistance xs ys = liftA2 max diff1 diff2
  where
    (min_xs,max_xs) = minmax xs
    (min_ys,max_ys) = minmax ys
    diff1 = liftA2 (-) max_xs min_ys
    diff2 = liftA2 (-) max_ys min_xs
  
main :: IO ()
main = do
  print $ maxDistance [4,5,7] [9,1,3,4]
  print $ maxDistance [2,3,5,4] [3,2,5,5,8,7]
  print $ maxDistance [2,1,11,3] [2,5,10,2]
  print $ maxDistance [1,2,3] [3,2,1]
  print $ maxDistance [1,0,2,3] [5,0]