2017-02-14 10 views
0

タプルのリストにタプルをマッチさせ、最初のタプルの2つの要素が後のリスト。これまで私はelem(私の最初のリストがサブリストと同じ数の要素を持っている場合のみ)とisInfixOf(範囲にない変数)を使用しようとしています。これについて行くためのヒント?リストがタプルのリストに含まれているかどうかをチェックする

matching (p,q) lst = foldl (\acc (x,y,_) -> if (x == p) && (y==q) then True || acc else False || acc) False lst 

基本的には、リスト内のタプルに対する入力のパターンマッチを行います。

matching ("Monday","Tuesday") [("Monday","Tuesday",10),("Tuesday","Sunday",20), ("Wednesday", "Friday", 22)] -> False 
matching ("Monday","Tuesday") [("Tuesday","Monday",10),("Tuesday","Sunday",20), ("Wednesday", "Friday", 22)] -> False 
+1

あなたはリストのリストにリストを照合について話をあなたの例では、タプルのリスト(タプルの長さが異なる)、つまり '(String、String) - > [(String、String、Int)] - > Bool'のリストに一致しています。 – dave

+0

@dave my bad、タプルをタプルのリストと照合したいと思います。 –

+2

あなたの例はどちらも 'False'の結果を示しています。 「真の」結果を生むものは何ですか? – chepner

答えて

1

はここ倍を使用して一つの方法です。少なくとも1つの一致が見つかると、アキュムレータはTrueに設定されます。

3

は、あなたが何をしたいかを見てみましょう:

  1. あなたは、彼らがそうでなければ一致するかFalse場合Trueを返し、他の長さのタプルにタプルを一致させる必要があります。
  2. 一致するものがある場合はTrue、一致しない場合はFalseを返してください。

標準機能はありますか? Hoogleは、役立つ機能の試行と検索に使用するリソースです。もちろん、何を検索するかを知る上での学習曲線があります。

私はaが一致させたいタプルであり、bがあなたのリストのタプルであるあなたの関数のタイプである(a -> b -> Bool) -> a -> [b] -> Boolを試しました。これは有用なマッチを得られなかった。しかし、私は(b -> Bool) -> [b] -> Boolの結果がhereであり、2番目の一致はanyと呼ばれる関数です(最初の関数はallですが便利ですが、何もしません)。

ここで必要なのは、タプルを取り込み、一致する場合にtrueを返す関数です。

タプルを使用しましたが、(a,b) -> (a,b,c) -> Boolを試してみました。一致するものは見つかりませんでした。我々は自分自身でそれを書く必要があるように見えます。

何かがうまくいくはずです: compareTuples a b = fst a == fst b && snd a == snd b またはcompareTuples (a,b) (c,d, _) = a == c && b == dです。

ええと、この機能のタイプは(a -> b -> Bool)ですが、any(b -> Bool)となりますので、どうすればいいですか?もちろん、部分的なアプリケーションで!あなたが使用している場合

matching t xs = any (compareTuples t) xs

1

それは簡単ですlenses

さらにETAの削減使用して簡略化することができ
matching a bs = not . any (\b -> (a^._1 == b^._1 && a^._2 == b^._2) 
           || (a^._1 == b^._2 && a^._2 == b^._1)) $ bs 

matching a = not . any (\b -> (a^._1 == b^._1 && a^._2 == b^._2) 
          || (a^._1 == b^._2 && a^._2 == b^._1)) 
関連する問題