この回答はitsbruce、引き続き を使用することによって の回答に基づいてlookupいますが、最初に入力リストをマッサージして、要素の順序ごとに 1 回、各ペアを 2 回含めます。
あなたのリストが呼ばれているとしましょう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')]
...タプルの2つの要素を取り、それらを交換する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')]