{-# LANGUAGE NoStarIsType #-}
module Main where
import BasePrelude
import CompoundTypes.Strict
main =
putStrLn "This demonstration is all about the compilability"
-- |
-- This function exhibits the benefit of the first-class sum-type
-- being usable as a function parameter.
--
-- It also shows, how we can pattern-match it.
intCharBoolSumToString :: (Int + Char + Bool) -> String
intCharBoolSumToString =
\case
Sum3_1 int -> "Int: " <> show int
Sum3_2 char -> "Char: " <> show char
Sum3_3 bool -> "Bool: " <> show bool
-- |
-- Following is an example of a more complicated composition,
-- which is the same as the following type:
--
-- > Sum3 Int (Product2 Char (Sum2 Bool Double)) Char
--
-- Just as in the math, the product operator exhibits a higher priority.
type SumAndProductMixture =
Int + Char * (Bool + Double) + Char
-- |
-- Where there is a multiplication and addition,
-- there naturally must be a division and subtraction!
--
-- Following is an example of how we can extract parts of a composite type.
-- Here the type becomes the same as the following:
--
-- > Bool + Double
type BoolOrDouble =
(SumAndProductMixture - Int - Char) / Char