二項関係 r の反射的・対称的・推移的閉包に (x,y) が属するかどうかを判定する関数 inEqvCl ってのを書いてみたんですけど、もうちょっとすっきりした書き方とかないでしょうか?
inEqvCl :: Eq a => (a,a) -> [(a,a)] -> Bool inEqvCl _ [] = False inEqvCl (x,y) s = chk s y x where chk lst v u | v == u = True | v `elem` ux = True | otherwise = or $ map (chk lst' v) ux where lst' = [ p | p <- lst, u /= fst p, u /= snd p ] ux = do p <- lst if u == fst p && u /= snd p then return $ snd p else if u == snd p && u /= fst p then return $ fst p else fail ""