newtype PrimeNumber = PrimeNumber Int deriving (Show) isPrime :: Int -> Bool isPrime k = if k > 1 then null [x | x <- [2 .. k - 1], k `mod` x == 0] else False mkPrime :: Int -> Maybe PrimeNumber mkPrime i = if isPrime i then Just (PrimeNumber i) else Nothing printPrime :: PrimeNumber -> IO () printPrime p = print p addPrimes :: PrimeNumber -> PrimeNumber -> PrimeNumber addPrimes (PrimeNumber p1) (PrimeNumber p2) = PrimeNumber (p1 + p2) main :: IO () main = do let number = 2 case mkPrime number of Just p -> do printPrime p let primesAdded = addPrimes p p in putStrLn ("primesAdded: " <> show primesAdded) Nothing -> putStrLn "number was not prime"