以前的廣度優先遍歷沒有Haskell代碼的實現,這裏補上。下面代碼使用了unordered-containers包的哈希表,用來實現圖;containers包的Seq類型,用來實現隊列,主要是由於使用內置的列表類型效率太差。數據結構
module Main where import qualified Data.HashMap.Strict as HM import Data.Maybe (fromJust) import qualified Data.Sequence as DS graph :: HM.HashMap String [String] graph = HM.fromList [("you",["alice", "bob", "claire"]), ("bob", ["anuj", "peggy"]), ("alice", ["peggy"]), ("claire", ["thom", "jonny"]), ("anuj",[]), ("peggy",[]), ("thom",[]), ("jonny",[]) ] personIsSeller :: String -> Bool personIsSeller name = last name == 'm' search :: HM.HashMap String [String] -> String -> Bool search graph name = loop $ DS.fromList (graph HM.! name) where loop queue | null queue = False | personIsSeller h = True | otherwise = loop $ (DS.drop 1 queue) DS.>< DS.fromList (graph HM.! h) where h = queue `DS.index` 0 main :: IO () main = do print $ search graph "you"
爲了能與Python對照,總體風格上與Python代碼保持一致,包括測試用例、圖的實現方式等等。
Haskell標準模塊並不包含一些經常使用的數據類型,因此,平常開發中須要大量使用其餘三方的包,其中containers和unordered-containers是最經常使用的容器包。oop
containers包含經常使用的圖、樹、集合等結構,具體包含Data.Graph、Data.Tree、Data.Map、Data.IntMap、Data.Set、Data.IntSet、以及例子中使用到的Data.Sequence等。測試
正如名字所示,unordered-containers包實現了基於無序的數據結構,包含基於哈希的映射和集合。spa
請繼續關注個人公衆號文章
code