{-| Module : Lower Description : Data type to produce only lowercase alphabetic characters. Copyright : © Frank Jung, 2021 License : GPL-3 Reference <https://stackoverflow.com/questions/23616455/haskell-type-new-type-or-data-for-only-an-upper-case-char type for uppercase characters> -} module Lower (mkLower) where import Data.Char (isAlpha, isLower) -- | Make a lowercase letter. mkLower :: Char -> Either String Char mkLower :: Char -> Either String Char mkLower Char x | Char -> Bool isLower Char x Bool -> Bool -> Bool && Char -> Bool isAlpha Char x = Char -> Either String Char forall a b. b -> Either a b Right Char x | Bool otherwise = String -> Either String Char forall a b. a -> Either a b Left String "Not lowercase" -- {-# LANGUAGE DataKinds #-} -- import Data.Finite -- import Data.Char -- -- newtype Letter = Letter{ getLetterIndex :: Finite 26 } -- -- toLowerChar :: Letter -> Char -- toLowerChar = chr . (+ ord 'a') . fromIntegral . getFinite . getLetterIndex -- -- fromLowerChar :: Char -> Maybe Letter -- fromLowerChar = fmap Letter . packFinite . fromIntegral . subtract (ord 'a') . ord