関数型プログラミング ..
591:デフォルトの名無しさん
05/05/22 16:51:02
ちょっと質問です。
二項関係 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 ""
実行例
(2,1) `inEqvCl` [(0,2),(3,4),(5,4),(1,5),(5,0),(6,7),(8,7)]
=> True
(1,6) `inEqvCl` [(0,2),(3,4),(5,4),(1,5),(5,0),(6,7),(8,7)]
=> False
次ページ続きを表示1を表示最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5401日前に更新/259 KB
担当:undef