私はHaskellの新しいセルフリーナーです。まず、タプルの2つのリストが等しいかどうかをチェックする関数を作成します。各タプルにはキーと値があります
次に、タプルの2つのリストを結合する関数が必要です
私はいくつかの方法を試し、何度も試しましたが、私の要件を満たすことができなかったようです。誰かが私を助けることができますか?前もって感謝します。
私の提案:2つのリストから結合されたキーを抽出する関数から始めます。
allKeys :: Eq a => Lis a -> Lis a -> [a]
そうallKeys [('a',2),('b',2),('c',3)] [('b',2),('a',1),('d',3)]
です['a','b','c','d']
。ヒント:両方のリストからすべてのキーを抽出し、それらを1つのリストにマージしてから、そのリストから重複を削除します(これらすべてのタスクには標準機能があります)。
この関数は、等式のチェックと合計の計算の両方に役立ちます。
考慮すべきことの1つ:リスト[('a',0)]
は同じである必要があり[]
ますか?それ以外の場合は、最初のケースと2番目のケースでキー「a」を返しMaybe Int
、与えるルックアップ関数を使用する必要があります。Just 0
Nothing
これが宿題ではない場合はお知らせください。コードを提供できます。
編集:コード!:)
以下のコードは、私が通常書く方法に比べて少し単純化されていますが、それほどではありません。Data.Listからインポートされるnub(重複を削除するため)など、なじみのないライブラリ関数がおそらくいくつかあります。
import Data.List(nub)
type Times = Int
type Lis a = [(a,Times)]
count :: Eq a => Lis a -> a -> Times
count xs x = case lookup x xs of
Nothing -> 0 -- x is not in the list
Just n -> n -- x is in the list associated with n
-- Extract all keys by taking the first value in each pair
keys :: Lis a -> [a]
keys xs = map fst xs
-- Extract the union of all keys of two lists
allKeys :: Eq a => Lis a -> Lis a -> [a]
allKeys xs ys = nub (keys xs ++ keys ys)
lisEquals :: Eq a=> Lis a -> Lis a -> Bool
lisEquals xs ys = all test (allKeys xs ys)
where
-- Check that a key maps to the same value in both lists
test k = count xs k == count ys k
lisSum :: Eq a => Lis a -> Lis a -> Lis a
lisSum xs ys = map countBoth (allKeys xs ys)
where
-- Build a new list element from a key
countBoth k = (k,count xs k + count ys k)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加