首页 > 解决方案 > Haskell中的对称关系

问题描述

我正在处理关系,我想找出关系是否对称。

为了找到一个关系是对称的,我们需要找到两个元组:[(a,b), (b,a)]

这是我到目前为止所得到的:

simmetry:: Eq a => [(a,a)] -> [a]
simmetry [] = []
simmetry (x:xs)
            | (fst x `elem` map snd xs) && (snd x `elem` map fst xs) = fst x : (simmetry xs)
            | otherwise = simmetry xs

这个函数的作用是,它抓取一个元组x并检查它是否在另一个元组中找到它的第一个元素作为第二个位置,以及检查第二个元素是否在另一个元组中作为第一个位置。

但是,我错过了必须检查另一个元组在两种情况下是否相同的部分。使用我的代码,这样的东西:[(a,b),(b,c),(d,a)]会工作。

PD:simmetry返回[a]用于测试目的。

我没有想法,任何提示都非常感谢!

标签: haskell

解决方案


您要检查的是:对于列表中的每个元组,也应该存在。你可以在 Haskell 中直接表达:(x,y)(y,x)

isSymmetric :: Eq a => [(a,a)] -> Bool
isSymmetric l = all (\(x,y) -> (y,x)`elem`l) l

这实际上是在做一些多余的工作,因为它总是会(x,y)自我检查,您对此并不真正感兴趣,但这并不重要。然而,以某种方式设计它是一个很好的练习,这样它就不会越过元素本身;为此,使用辅助功能很有帮助

foci :: [a] -> [(a,[a])]

与行为

foci [p,q,r] ≡ [(p,[q,r]), (q,[p,r]), (r,[p,q])]

然后你离开allfoci输入列表,即

isSymmetric = all _ . foci

推荐阅读