Haskell中的Chars对列表?

时间:2013-11-14 21:45:25

标签: haskell char tuples

在Haskell中是否有一个函数,如果你提供了一个Char,一个13对Chars的列表(所有不同的,即字母表中的每个字母只使用过一次),它会返回你配对的Char使用您输入的Char,即如果我输入以下内容:

pairedChar 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?

如果没有这样的功能,我认为可能是通过解压缩来获取一对列表但是在我得到它们之后不知道如何处理这些列表?

3 个答案:

答案 0 :(得分:3)

查找功能执行此操作;不只是你描述的那种对,而是任何两元素元组的列表。顺便说一下,这种元组的列表被称为关联列表。

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

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

looks up a key in an association list

答案 1 :(得分:2)

这个答案建立在itsbruce的答案的基础上,仍然使用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)

现在,您可以在lookup列表中执行allPairs

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')]

答案 2 :(得分:0)

你可以制作一个更长的清单。

alphabet = "ABCDEFGHIJKLMNOPQRTSUVXYZ"

pairs = zip alphabet (reverse alphabet)

theOtherChar k = lookup k pairs --does the job for you now.