You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Haskell中通过双字符串模式匹配实现转子加密?

在Haskell中实现单表替换加密

需求说明

基于给定的两个字符串实现加密:

  • 原字母表:"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  • 替换表:"EKMFLGDQVZNTOWYHXUSPAIBRCJ"
    要求输入明文HELLO时,输出密文QLTTY。

实现思路

这是典型的单表替换加密:明文中的每个字母,对应替换表中相同位置的字母(原字母表第n个字符 → 替换表第n个字符)。我们可以通过构建字符映射表,再对明文逐个字符替换来实现。

代码实现

基础版本(列表映射)

-- 定义原字母表和替换表
alphabet :: String
alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

cipherTable :: String
cipherTable = "EKMFLGDQVZNTOWYHXUSPAIBRCJ"

-- 构建字符映射:将原字母与替换字母配对
cipherMap :: [(Char, Char)]
cipherMap = zip alphabet cipherTable

-- 单字符加密:查找映射表,未匹配则返回原字符
encryptChar :: Char -> Char
encryptChar c = case lookup c cipherMap of
                  Just encrypted -> encrypted
                  Nothing -> c

-- 字符串加密:对每个字符应用加密逻辑
encrypt :: String -> String
encrypt = map encryptChar

优化版本(Data.Map 提高查找效率)

如果需要处理大量字符,用Data.Map构建映射会更高效:

import qualified Data.Map as Map

alphabet :: String
alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

cipherTable :: String
cipherTable = "EKMFLGDQVZNTOWYHXUSPAIBRCJ"

-- 构建Map类型的映射表
cipherMap :: Map.Map Char Char
cipherMap = Map.fromList $ zip alphabet cipherTable

-- 单字符加密:未匹配则返回原字符
encryptChar :: Char -> Char
encryptChar c = Map.findWithDefault c c cipherMap

-- 字符串加密
encrypt :: String -> String
encrypt = map encryptChar

测试验证

在GHCi中运行测试:

*Main> encrypt "HELLO"
"QLTTY"

说明

  • 两个版本核心逻辑一致:通过zip将原字母表与替换表配对,形成字符映射关系,本质上是利用模式匹配完成查找。
  • 代码兼容非字母字符:输入中的非大写字母会直接返回原字符。

内容的提问来源于stack exchange,提问作者Palma Rey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 22:40:30