Skip to content

Instantly share code, notes, and snippets.

@mmitou
Created November 5, 2012 10:29
Show Gist options
  • Save mmitou/4016526 to your computer and use it in GitHub Desktop.
Save mmitou/4016526 to your computer and use it in GitHub Desktop.
深さ優先探索のHaskell版(モナド変換子練習用)
import Control.Monad.Reader
import Control.Monad.State
import qualified Data.Map as Map
data Elem = A | B | C | D | E | F | G
deriving (Show, Eq, Ord)
type Visited = [Elem]
type AdjMap = Map.Map Elem [Elem]
testData = Map.fromList [ (A, [B,C,E])
, (B, [D,F])
, (C, [G])
, (D, [])
, (E, [F])
, (F, [])
, (G, [])]
depthFirstSearch :: Elem -> StateT Visited (Reader AdjMap) [Elem]
depthFirstSearch begin = do
visited <- get
if elem begin visited
then return []
else do
put (begin : visited)
adjmap <- lift ask
ll <- mapM depthFirstSearch (adjmap Map.! begin)
return $ (concat ll) ++ [begin]
main = do
let (l, _) = runReader (runStateT (depthFirstSearch A) []) testData
print l
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment