I'm trying to make a data type in Haskell that will only match lowercase chars, but not uppercase chars. I'm looking for something like this:
data LowerChar = [a..z]
Run Code Online (Sandbox Code Playgroud)
Cac*_*tus 10
由于该间隔中只有26个字符,因此可以使用例如26个值的有限类型来表示类型Data.Finite:
{-# 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
Run Code Online (Sandbox Code Playgroud)
当然,如果需要,您也可以将同一类型解释为大写字母。