我们有这棵树:
data Bintree a = Empty | Fork a (Bintree a) (Bintree a) deriving Show
data Edge = Left | Right deriving Show
type Node = [Edge]
我应该在其中搜索一个元素。如果我找到它,我会返回Just Node。如果没有,我什么都没回来。树没有订购。
search :: Eq a => a -> Bintree a -> Maybe Node
搜索功能应该如下所示。
答案 0 :(得分:3)
search :: Eq a => a -> Bintree a -> Maybe [Edge]
search a Empty = Nothing
search a (Fork b lt rt) = (guard (a==b) >> pure [])
<|> (Left :) <$> search a lt
<|> (Right :) <$> search a rt
应该做的伎俩。执行左偏置深度优先搜索,将路径返回到第一个匹配值(如果有)。
这使用Just
作为Functor,作为Alternativeative,Monad和MonadPlus,使用数据类型编码的行为来避免我们自己编写一些平凡的代码。