1

Haskell 中是否有一个函数,如果您提供了一个字符和 13 对字符的列表(所有不同的字符,即字母表中的每个字母都使用一次且仅一次),它会返回与您输入的字符配对的字符Char ie 如果我输入以下内容:

配对字符 Q [(A,Z),(B,Y),(C,X),(D,W),(E,V),(F,U),(G,T),(H,S) ,(I,R),(J,Q),(K,P),(L,O),(M,N)]

我希望它返回J?

如果没有这样的功能,我可能会考虑使用 unzip 来获取一对列表,但不确定在获得列表后如何处理它们?

4

3 回答 3

4

查找函数执行此操作;不仅适用于您描述的那种对,而且适用于任何二元素元组列表。顺便说一下,这样的元组列表称为关联列表。

它返回一个可能,因为可能没有匹配。

lookup :: Eq a => a -> [(a, b)] -> Maybe b
lookup key assocs

looks up a key in an association list
于 2013-11-14T21:51:46.330 回答
2

这个答案建立在itsbruce's answer 的基础上,仍然使用lookup,但还首先按摩输入列表以包括每对两次,一次用于元素的每个排序。

假设您的列表称为pairs

pairs :: [(Char, Char)]
pairs = [('A', 'Z'), ('B', 'Y'), ..., ('M', 'N')]

然后你需要做的就是复制每一对并交换元素:

import Data.Tuple (swap)

allPairs :: [(Char, Char)]
allPairs = pairs ++ map swap pairs

-- allPairs = [('A', 'Z') ... ('M', 'N'), ('Z', 'A'), ... ('N', 'M')]

...哪里swap是一个函数,Data.Tuple它接受元组的两个元素并交换它们。它是这样定义的:

swap :: (a, b) -> (b, a)
swap (x, y) = (y, x)

现在你可以lookupallPairs清单上做一个:

pairedChar :: Char -> Maybe Char
pairedChar c = lookup c allPairs

如果您希望每个重复对在列表中彼此相邻,那么您也可以allPairs这样写:

allPairs = do
    (x, y) <- pairs
    [(x, y), (y, x)]

现在它将包含以下顺序:

allPairs = [('A', Z'), ('Z', 'A'), ('B', 'Y'), ('Y', 'B') ... ('M', 'N'), ('N', 'M')]
于 2013-11-14T23:19:16.737 回答
0

你可以列一个更长的清单。

字母 = "ABCDEFGHIJKLMNOPQRTSUVXYZ"

对 = zip 字母(反向字母)

theOtherChar k = 查找 k 对——现在为您完成这项工作。
于 2013-11-14T23:11:33.060 回答