首页 > 解决方案 > 如何在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 方法?

标签: haskell

解决方案


推荐阅读