说我有一对和一对对。如何检查对中的任何字符(第一个或第二个)是否已经存在于对列表中(同样是任何元素以及第一个还是第二个)?
答案 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
有三个参数:
traverse
是遍历,表示列表的每个元素,而both
是遍历,表示一对的两个元素,因此traverse.both
是遍历,表示两个元素所有对中的对。