【发布时间】:2014-05-07 04:22:48
【问题描述】:
我想使用haskell package for relations。
如何检查关系是否对称?即,给定关系的函数返回 true,如果对于所有 a b,a rel b 意味着 b rel a。
【问题讨论】:
我想使用haskell package for relations。
如何检查关系是否对称?即,给定关系的函数返回 true,如果对于所有 a b,a rel b 意味着 b rel a。
【问题讨论】:
我之前没有使用过关系包,但看起来这样可以:
import Data.Relation
symmetric :: Ord a => Relation a a -> Bool
symmetric rel = and [member b a rel | (a, b) <- toList rel]
测试:
> symmetric $ fromList [(1, 2), (2, 1)]
True
> symmetric $ fromList [(1, 2), (2, 3)]
False
【讨论】:
import Data.Relation
swap :: (a, b) -> (b, a)
swap (a, b) = (b, a)
inverse :: (Ord a, Ord b) => Relation a b -> Relation b a
inverse = fromList . map swap . toList
symmetric :: Ord a => Relation a a -> Bool
symmetric r = r == inverse r
【讨论】: