仅小写字符的数据类型

时间:2019-06-05 10:17:56

标签: haskell

我正在尝试在Haskell中创建仅匹配小写字符而不匹配大写字符的数据类型。我正在寻找这样的东西:

data LowerChar = [a..z]

1 个答案:

答案 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

当然,如果需要,您也可以将同一类型解释为大写字母。