haskell - 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 中直接表达:(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])]
然后你离开all
了foci
输入列表,即
isSymmetric = all _ . foci
推荐阅读
- oauth - Microsoft Web 插件“Office.context.mailbox.getCallbackTokenAsync”在我的 Exchange 2016 上返回响应“失败”,但在 Office 365 在线版中有效
- python - 项目目录结构python数据
- css - 第 1 行和第 2 行的 CSS 表格样式,然后是第 3 和第 4 行的另一种样式并重复,总共两种样式
- c# - 如何使用 Linq Select 投影修复 Entity Framework Core“参数类型不匹配”
- c++ - C++ `this` 指针
- security - 将应用程序注册设置为“任何组织目录中的帐户”有什么影响
- python-3.x - 如何在pyinstaller中更改窗口的标题?
- haskell - Haskell Bool to Char 函数似乎有错误的类型
- excel - VBA:将 ODBC 查询结果存储在代码中,而不是显示它
- java - 如何修复 Android Studio 中的“null json data”错误