haskell - 如何在haskell中创建一个新的泛型类型并重新定义==?
问题描述
我的下一个 haskell 代码成功运行:
type Relation a = [[a]]
isAEquivalentRelation :: Eq a => Relation a -> Bool
isAEquivalentRelation x = isASimetricRelation x && isAReflexiveRelation x && isATransitiveRelation x
isASimetricRelation :: Eq a => Relation a -> Bool
isASimetricRelation [] = True
isASimetricRelation (x:xs) = (elem (reverse x) (x:xs)) && (isASimetricRelation (filter (/= y) xs)) where y = (reverse x)
isAReflexiveRelation :: Eq a => Relation a -> Bool
isAReflexiveRelation [] = True
isAReflexiveRelation x = isAReflexiveRelationRec (filter (\ a -> a !! 0 == a !! 1) x) x
isAReflexiveRelationRec :: Eq a => Relation a -> Relation a -> Bool
isAReflexiveRelationRec [] _ = False
isAReflexiveRelationRec _ [] = True
isAReflexiveRelationRec pr (x:xs) = or ( map (== [x!!0,x!!0]) pr) && or ( map (== [x!!1,x!!1]) pr) && isAReflexiveRelationRec pr xs
isATransitiveRelation :: Eq a => Relation a -> Bool
isATransitiveRelation [] = True
isATransitiveRelation x = isATransitiveRelationRec x x
isATransitiveRelationRec :: Eq a => Relation a -> Relation a -> Bool
isATransitiveRelationRec _ [] = True
isATransitiveRelationRec original (x:xs) = and ( map (\ a -> elem a original) (map (\ a -> [x !! 0, a !! 1]) (filter (\ a -> x !! 1 == a !! 0) original)) ) && isATransitiveRelationRec original xs
areEqual :: Eq a => Relation a -> Relation a -> Bool
areEqual x y = subset x y && subset y x
subset :: Eq a => Relation a -> Relation a -> Bool
subset [] _ = True
subset _ [] = False
subset x y = and (map (\ a -> elem a y) x)
问题是我需要使用我已经实现的 areEqual 方法重新定义 Relation 类型的 == ,但我无法实现这个工作。我已经尝试了很多关于类、实例和数据的事情,但我被困住了,我如何声明一个通用的 Relation 类型并重新定义运算符 == 以匹配 areEqual 方法?
解决方案
推荐阅读
- apache-spark - Apache Spark:show() 函数是一项昂贵且不安全的操作吗?
- visual-studio-2015 - 使用openssl时如何检测内存泄漏
- c++ - 如何在简单的录音机程序中使用 audioDeviceIOCallback、audioDeviceAboutToStart 和 audioDeviceStopped
- powershell - Powershell Copy-To - 如果目标目录存在,则复制到现有目录
- mysql - 减少查询 Yii2
- ide - STM32F4 切换 IDE 后 systick 的时序问题(coocox 到 TrueStudio)
- python - 在 Python 中动态地将超类添加到已知类
- laravel - Laravel 5.1 最大图像大小
- amazon-web-services - 在 AWS Elastic Beanstalk 和 EKS 上部署了一个 laravel 应用程序 相同的数据库 RDS 为什么在 Elastic Beanstalk 中获得快速响应
- c# - 我在使用 C# 对 Dynamics 365 普通用户进行身份验证时遇到错误