1

Haskellには、Charと13ペアのCharのリスト(すべて異なる、つまり、アルファベットのすべての文字が一度だけ使用された)を指定した場合、入力とペアになっているCharを返す関数がありますか次のように入力した場合の Char ie:

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を返したいですか?

そのような機能がない場合は、リストのペアを取得するために unzip で実行することを考えていましたが、リストを取得した後、リストをどうするかわかりませんでしたか?

4

3 に答える 3

4

ルックアップ関数がこれを行います。説明するペアの種類だけでなく、2要素タプルのリストについても。ちなみに、このようなタプルのリストは連想リストと呼ばれます。

一致するものがない可能性があるため、Maybe を返します。

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、引き続き を使用することによって の回答に基づいて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')]
于 2013-11-14T23:19:16.737 に答える
0

より長いリストを作成することもできます。

アルファベット = "ABCDEFGHIJKLMNOPQRTSUVXYZ"

ペア = zip アルファベット (逆アルファベット)

theOtherChar k = lookup k ペア -- これで作業が完了します。
于 2013-11-14T23:11:33.060 に答える