haskell - 仅小写字符的数据类型
问题描述
我试图在 Haskell 中创建一个只匹配小写字符而不匹配大写字符的数据类型。我正在寻找这样的东西:
data LowerChar = [a..z]
解决方案
由于该间隔中只有 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
当然,如果您愿意,您也可以将相同的类型解释为大写字母。
推荐阅读
- ios - 配置文件不包括当前选择的设备错误
- c# - Azure.Storage.Blobs v12.xx 中的 ContentHash 为空
- reactjs - 状态更新只有一次反应钩子
- linux - 如何将 bash 文件本身复制到输出目录
- scala - 如何访问 JsValue 中的嵌套值?
- angular - HttpClient get Request with Bearer Token 不适用于Angular,但适用于Postman
- docker - 更改 Docker 容器环境变量,如 Kitematic,但使用命令行
- tensorflow - 如何将 tflite 模型转换为 Tensorflow 中的冻结图 (.pb)?
- javascript - 如何以编程方式在 Ar.js 中使用查看功能
- java - GWT - 在服务工作者中使用编译代码 (JsInterop)