这个答案建立在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)
现在你可以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')]