2016-12-07 5 views
3

タプルのリストがあります。それぞれのタプルもタプルです。それぞれの外部タプルに対して、私はコンジュゲートタプルを持っています。これは私が(a、b)をリストに入れば、(b、a)も持っていることを意味します。私が望むのは、リストから共役タプルを削除することです。あなたは私のリストの具体的な例を与えることをHaskellのリストからコンジュゲートタプルを削除する

ここにある:

[((1,2,1,0),(5,2,1,0)),((2,4,4,0),(2,5,4,0)),((2,5,4,0),(2,4,4,0)),((3,1,1,0),(3,3,2,0)),((3,3,2,0),(3,1,1,0)),((5,1,7,0),(8,1,7,0)),((5,2,1,0),(1,2,1,0)),((5,5,8,0),(8,5,8,0)),((5,6,6,0),(8,6,8,0)),((5,9,9,0),(8,9,9,0)),((6,3,5,0),(6,8,9,0)),((6,8,9,0),(6,3,5,0)),((7,7,6,0),(9,7,6,0)),((8,1,7,0),(5,1,7,0)),((8,5,8,0),(5,5,8,0)),((8,6,8,0),(5,6,6,0)),((8,9,9,0),(5,9,9,0)),((9,7,6,0),(7,7,6,0))]

結果共役タプルがなければなりません削除した後:

[((1,2,1,0),(5,2,1,0)),((2,4,4,0),(2,5,4,0)),((3,1,1,0),(3,3,2,0)),((5,1,7,0),(8,1,7,0)),((5,5,8,0),(8,5,8,0)),((5,6,6,0),(8,6,8,0)),((5,9,9,0),(8,9,9,0)),((6,3,5,0),(6,8,9,0)),((7,7,6,0),(9,7,6,0)),]

私は時間のために試してみました成功なし。どんな助けもありがとう。 「タプルの各要素は、同様のタプルである」

+0

"各タプルもタプルです。"あなたは各タプルもタプルで構成されていることを意味します。 – jpath

+0

これは宿題の練習ですか?それはヒントが必要なのか、それとも解決策が欲しいのですか? – jpath

+0

はい。私が掲載した例が私の言葉より優れているかもしれません:) –

答えて

2

removeConj xs = foldl f [] xs 
    where f b a = if (elem (snd a, fst a) b) then b else (a:b) 
+0

まあ、ありがとう。しかし、私はそれを試して、それは私に同じリストを与えた、すなわち、コンジュゲートを削除していない。 –

+0

ああ、右、私の悪い。このバージョンを試してみてください。 –

+0

はい、うまくいきました。ありがとう。面白いことですが、結果のリストの順序は、jpathソリューションが生成するリストの逆です。私は逆の機能を適用して注文を保持できると思う。 –

5

まず、私たちは次のようにタイプを一般化することができます

nubTuples :: Eq a => [(a,a)] -> [(a,a)] 

しかし、物事を効率的にかつ容易にもしてみましょうしますaOrdインスタンスを要求してください。なぜこれは物事を楽にするのでしょうか?これで、タプルを規則正しい形式に変換できるようになりました。それでは簡単にnub . sortとすることができます。以下の実装は、実際にはその表現に基づいてソートしてノブを作成するので、nubTuples [(2,1)] = [(2,1)]ではなく[(1,2)]となります。これは、順序を変更し、重複を削除すること

import Data.List (sortOn, nubBy) 
import Data.Tuple (swap) 

nubTuples :: Ord a => [(a,a)] -> [(a,a)] 
nubTuples = nubBy unorderedCompare . sortOn orderTuple 
    where orderTuple (x,y) 
      | x < y = (x,y) 
      | otherwise = (y,x) 
     unorderedCompare x y = x == y || swap x == y 

注:私たちはdiscriminationパッケージにData.DiscriminationからnubWith機能を使用することによってこの問題を解決することができ順序を変更するよう

nubTuples [(3,4),(1,2),(1,2)] = [(1,2),(3,4)] 

。そして、我々のコードは次のようになる:

import Data.Discrimination (nubWith, Grouping) 

nubTuples :: (Ord a, Grouping a) => [(a,a)] -> [(a,a)] 
nubTuples = nubWith orderTuple 
    where orderTuple (x,y) 
      | x < y = (x,y) 
      | otherwise = (y,x) 

これは、ソートする必要はありませんが、そのままの順序を保持し、(多くの場合、パフォーマンスのために非常に重要である)最大限に怠惰です。それはまだ重複を削除します。 4タプルのためGroupingのインスタンスがないことを

{-# LANGUAGE DeriveGeneriC#-} 
import Data.Discrimination 
import GHC.Generics 

data A = A deriving Generic 
instance Grouping A 

注:

あなたは単にあなたのタイプのいずれかのGroupingインスタンスを導出することができますが、これを気に入っています。これは回避する方法です:

nubFourTuples :: (Grouping a, Ord a, Grouping b, Ord b, 
        Grouping c, Ord c, Grouping d, Ord d) 
       => [((a,b,c,d),(a,b,c,d))] -> [((a,b,c,d),(a,b,c,d))] 
nubFourTuples = (fmap . both) reassociate . nubTuples . (fmap . both) associate 
    where associate (w,x,y,z) = ((w,x),(y,z)) 
     reassociate ((w,x),(y,z)) = (w,x,y,z) 
     both f (x,y) = (f x, f y) 
+0

多くのありがとう@jpath。出来た。結果のリストの順序は私にとって重要ではありません。 –

+0

@ハッサンシャヒンようこそ。私はまだ注文を維持し、怠け者であるという追加の利点がある別のバージョンを追加しました。 – jpath

+0

うん。私は気づきました。再度ありがとう@jpath –

関連する問題