我正在尝试在Haskell中创建仅匹配小写字符而不匹配大写字符的数据类型。我正在寻找这样的东西:
data LowerChar = [a..z]
答案 0 :(得分: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
当然,如果需要,您也可以将同一类型解释为大写字母。