この回答は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')]