成对的对和列表

时间:2013-11-28 22:25:04

标签: haskell tuples lookup

说我有一对和一对对。如何检查对中的任何字符(第一个或第二个)是否已经存在于对列表中(同样是任何元素以及第一个还是第二个)?

4 个答案:

答案 0 :(得分:1)

一个严格的实施将是:

containsAny :: (Char, Char) -> [(Char, Char)] -> Bool
containsAny (a, b) = any (\(x, y) -> a == x || a == b || a == x || a == y)

如果您将类型指定为

,则可以使其更通用
containsAny :: Eq a => (a, a) -> [(a, a)] -> Bool

答案 1 :(得分:0)

这是一种直截了当的方法:

f :: (Char, Char) -> [(Char, Char)] -> Bool
f (a,b) xs = any (\x -> x == a || x == b) ((map fst xs) ++ (map snd xs))

我们首先构造一个懒惰的列表,它是一个扁平的结构;所有第一个元素和所有第二个元素的串联。然后我们用any遍历该列表,使用lambda来检查列表中的元素是否与作为函数参数传递的元素匹配。

答案 2 :(得分:0)

import Data.Functor
f (x, y) pairs = x `elem` allValues || y `elem` allValues
    where allValues = (fst <$> pairs) ++ (snd <$> pairs)

答案 3 :(得分:0)

镜片解决方案可能是

import Control.Lens

f (x, y) pairs = anyOf (traverse.both) (\c -> c == x || c == y) pairs

经过测试

λ> f ('p', 'o') [('h','e'),('l','l'),('o','w'),('o','r'),('l','d')]
True
λ> f ('q', 'v') [('n', 'o'), ('p', 'e')]
False
当您想要窥探数据结构时,

lens包含许多有用的组合器。 anyOf有三个参数:

  1. 遍历,指示您感兴趣的结构中的哪些元素,
  2. 您希望至少保留其中一个元素的谓词,
  3. 您正在研究的数据结构。
  4. traverse是遍历,表示列表的每个元素,而both是遍历,表示一对的两个元素,因此traverse.both是遍历,表示两个元素所有对中的对。