Project Inquiry

Normalizable type-class

Challenge
{-# LANGUAGE NoImplicitPrelude #-}

module Main where

import           Prelude
import           Data.Char (toLower)

main :: IO ()
main = putStrLn $ if test then "SUCCESS" else "FAILURE"

newtype Name = Name { unName :: String } deriving (Eq)
newtype Domain = Domain { unDomain :: String } deriving (Eq)
data Email = Email { name :: Name, domain :: Domain } deriving (Eq)

test :: Bool
test = let normalized = Email (Name "tony") (Domain "stark.com") in
       and [ normalize (Email (Name "tony") (Domain "stark.com")) == normalized
           , normalize (Email (Name "Tony") (Domain "Stark.com")) == normalized
           ]

class Normalizable a where
  normalize :: a -> a

-- TODO: This program doesn't compile. Define the missing function(s) incl. type signatures!
Solution
{-# LANGUAGE NoImplicitPrelude #-}

module Main where

import           Prelude
import           Data.Char (toLower)

main :: IO ()
main = putStrLn $ if test then "SUCCESS" else "FAILURE"

newtype Name = Name { unName :: String } deriving (Eq)
newtype Domain = Domain { unDomain :: String } deriving (Eq)
data Email = Email { name :: Name, domain :: Domain } deriving (Eq)

test :: Bool
test = let normalized = Email (Name "tony") (Domain "stark.com") in
       and [ normalize (Email (Name "tony") (Domain "stark.com")) == normalized
           , normalize (Email (Name "Tony") (Domain "Stark.com")) == normalized
           ]

class Normalizable a where
  normalize :: a -> a

-- DONE
instance Normalizable Name where
  normalize = Name . fmap toLower . unName

instance Normalizable Domain where
  normalize = Domain . fmap toLower . unDomain

instance Normalizable Email where
  normalize email = Email (normalize . name $ email) (normalize . domain $ email)