首页 > 解决方案 > 仅小写字符的数据类型

问题描述

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

data LowerChar = [a..z]

标签: haskell

解决方案


由于该间隔中只有 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

当然,如果您愿意,您也可以将相同的类型解释为大写字母。


推荐阅读