-1

在 Haskell 中,我将构建 2 个字符列表;一个是原始字母表中的26个字符(A,B,C,D,....Z),全部大写。另一个是相同的列表,但字母顺序发生了变化,例如(B,H,A,I......S). 现在我还要在这两个列表之间进行替换,例如当输入B然后返回时HC返回A

谁能帮我解决这个问题?

4

2 回答 2

2

首先,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 如何迫使您明确处理这种情况)。

于 2013-10-18T19:58:27.697 回答
0

假设修改后的字母表是:

"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会从一个修改后的回信,基于原来的一个。

于 2013-10-18T19:45:20.077 回答