在 Haskell 中,我将构建 2 个字符列表;一个是原始字母表中的26个字符(A,B,C,D,....Z)
,全部大写。另一个是相同的列表,但字母顺序发生了变化,例如(B,H,A,I......S)
. 现在我还要在这两个列表之间进行替换,例如当输入B
然后返回时H
,C
返回A
。
谁能帮我解决这个问题?
首先,Haskell 中的列表文字使用方括号[]
。
其次,我不知道你的作业的措辞,但不受约束,我会使用一个关联列表而不是两个列表。关联列表是形式对的列表[(a,b)]
。关联列表上的键操作,在 中lookup
定义Data.List
。查看类型签名,看看你是否弄清楚它的作用。
如果您从两个列表开始,您可以将它们压缩。
import Data.List
import Data.Maybe
codec = zip "ABCDEF..." "BHAI..." -- String ~ [Char]
encode = map $ flip lookup codec
plainText = "The secret fox"
encodedText = encode plainText
请注意,这会为您提供一个[Maybe Char]
. 我留给你弄清楚如何提取字符,因为它实际上是一种设计选择。(您是否只想省略未出现在 codex 中的字符,或者插入“!”或其他内容,以便用户知道数据已丢失?这里有很多选项。注意 Maybe monad 如何迫使您明确处理这种情况)。
假设修改后的字母表是:
"ORXBMDTCIGJYKAVLSWFNUQEHZP"
代码应如下所示:
import Data.List
import Data.Maybe
alphabet = ['A'..'Z']
mapping = zip alphabet "ORXBMDTCIGJYKAVLSWFNUQEHZP"
according letter = (snd . fromJust . (find (\t -> f t letter))) mapping
where
f (x, y) letter = x == letter
main = print $ according 'H'
mapping
将创建字母表和修改版本之间的对应关系。并且according
会从一个修改后的回信,基于原来的一个。