fork(2) download
  1. data Result t
  2. = Ok t
  3. | Err String
  4. deriving (Show, Eq)
  5.  
  6. instance Functor Result where
  7. fmap f (Ok x) = Ok (f x)
  8. fmap _ (Err msg) = Err msg
  9.  
  10. instance Applicative Result where
  11. pure = Ok
  12. Ok f <*> Ok x = Ok (f x)
  13. Ok f <*> Err msg = Err msg
  14. Err msg <*> _ = Err msg
  15.  
  16. instance Monad Result where
  17. (Ok v) >>= k = k v
  18. (Err msg) >>= k = Err msg
  19. return v = Ok v
  20. fail msg = Err msg
  21.  
  22.  
  23. data Item = Item {
  24. id :: Int,
  25. name :: Maybe String
  26. } deriving (Show, Eq)
  27.  
  28. getId :: Maybe Int -> Result Int
  29. getId Nothing = Err "No ID provided"
  30. getId (Just id) = Ok id
  31.  
  32. getItem :: Int -> Result Item
  33. getItem id
  34. | id `rem` 2 == 0 = Ok ( Item id Nothing)
  35. | id `rem` 3 == 0 = Ok ( Item id (Just ("item-" ++ show id)))
  36. | otherwise = Err ("Item not found, ID = " ++ show id)
  37.  
  38. getName :: Item -> Result String
  39. getName (Item id Nothing ) = Err ("Item has no name, ID = " ++ show id)
  40. getName (Item _ (Just name)) = Ok name
  41.  
  42. doSomethingClever :: Int -> String -> String
  43. doSomethingClever id name = show id ++ " => " ++ name
  44.  
  45. tryToDoSomethingClever :: Maybe Int -> Result String
  46. tryToDoSomethingClever idParam = do
  47. id <- getId idParam
  48. item <- getItem id
  49. name <- getName item
  50. return (doSomethingClever id name)
  51.  
  52. demoInputs = [Nothing, Just 1, Just 2, Just 3]
  53.  
  54. main = mapM_ (print . tryToDoSomethingClever) demoInputs
  55.  
Success #stdin #stdout 0s 4192KB
stdin
Standard input is empty
stdout
Err "No ID provided"
Err "Item not found, ID = 1"
Err "Item has no name, ID = 2"
Ok "3 => item-3"