■
Haskellは適当な勉強しかしてないので、基本的な知識が欠けているような。あんまり参考にしてはいけません。
data CondOp = Gt | Ge | Lt | Le | Ne | Eql deriving (Eq) -- deriving(Eq)!!
deriving (Eq)を知らなかったので、これまで(Eq CondOp)を一個一個手で書いてたという。(手作りの素晴らしさを、もう一度思い出してみませんか?)
レコードの一部だけとりかえた値を
data Nanika = Nanika { a::Int, b::Int }
こういうのがあったとしたら、
func :: Env -> Env func e = e { a = 40 }
これでいいんだって。
func Nanika { a=a, b=b } = Nanika { a=40, b=b }
こうやって書いてたという。
あと、パターンマッチでマッチした値に名前付けられる
func a = case a of x @ Nanika { a=_, b=40 } -> x
こうすれば、まあ、そんなこんな。(←説明するのが面倒になったらしい)
http://morihyphen.hp.infoseek.co.jp/files/a24z-futon.tar.gz
とりあえず、支配辺境までできた。あと一歩だなー。
*Parse> testToplev "module X; machine N{ while (1) {} }" dumpDF [(0,[]),(1,[1]),(2,[]),(3,[1])]
参考。
http://www.amazon.co.jp/gp/product/4254121393/503-6845711-3191923?v=glance&n=465392
昔思い付きで買ったんだけど、この本一万円もしてんだよなー。
なんか、こんなの。書いた自分でも何をやってるかわからない。
type DomList = [(DG.Node,[DG.Node])] type IDomList = [(DG.Node,[DG.Node])] lookupForce :: Eq a => a -> [(a,b)] -> b lookupForce key l = case DL.lookup key l of Just n -> n idom :: Graph gr => gr a b -> DomList -> DG.Node -> DG.Node -- 支配リストから、直接支配してるのを求める idom g domList target = findIDom dom where { findIDom (x:xs) | or $ DL.map (\y -> elem y xs) (suc g x) = findIDom xs | otherwise = x ; dom = DL.delete target (lookupForce target domList) } type DomTree = Tree DG.Node idomList :: Graph gr => gr a b -> DomList -> Node -> IDomList -- (ノード、それが直接支配してるの) のリスト idomList gr doms start = let n = nodes gr in DL.map (\x -> (x, DL.filter (\y -> idom gr doms y == x) (DL.delete start n))) n buildDomTreeSub :: IDomList -> DG.Node -> DomTree buildDomTreeSub idomList n = let idoms = lookupForce n idomList in DT.Node { rootLabel = n , subForest = DL.map (buildDomTreeSub idomList) idoms } buildDomTree :: CFG->DomTree -- 支配木 buildDomTree CFG { body=body, startLabel=start, endLabel=end } = let { doms = dom body start ; idoms = idomList body doms start } in buildDomTreeSub idoms start df :: Graph gr => gr a b -> DomTree -> [(DG.Node,[DG.Node])] -- 支配木 → 支配辺境 df g (DT.Node {rootLabel=root, subForest=children}) = let { dfSuc = [ x | x <- suc g root, DL.notElem x (DL.map DT.rootLabel children) ] ; dfChildren = concatMap (df g) children ; dfChildrenNodes = concatMap snd dfChildren ; idoms = DL.map rootLabel children} in [ (root, nub $ dfSuc ++ (DL.filter (\x->notElem x idoms) dfChildrenNodes)) ] ++ dfChildren
僕はHaskellのコードの読み易さは死ぬまで理解できないだろうな…
昔、「Haskellの簡潔さはPerlのアレっぷりと似てるよなー」っていうようなことを考えて、それは、「慣れてないからでは?」と、思ってたんだけど、まあ、慣れてもわからんというか。
↓なんか、fgl(グラフのライブラリ)の中にあった。
(.:) :: (c -> d) -> (a -> b -> c) -> (a -> b -> d) -- f .: g = \x y->f (g x y) -- f .: g = (f .) . g -- (.:) f = ((f .) .) -- (.:) = (.) (.) (.) (.:) = (.) . (.)
これは無理。