haskell 中的决策树定义 >>= 和 return

Decision Tree in haskell defining >>= and return

我正在尝试为游戏制作决策树并且我有:

data DecisionTree a
   = Result a
   | Decision [DecisionTree a]
   deriving (Eq,Show)`

此外,我还有

instance Functor DecisionTree where
    fmap = liftM

现在我必须定义

instance Monad DecisionTree where
-- return :: a -> DecisionTree a
   return = ...
-- (>>=) :: DecisionTree a -> (a -> DecisionTree b) -> DecisionTree b
   (>>=) = ...

现在我有点困惑如何填写定义。

为了定义 >>= 我尝试将定义分为两种情况:

(>>=) (Result a) f    = f a
(>>=) (Decision ys) f = Decision (fmap (>>= f) ys)

至于return我认为至少是

return = Result

但这只会构建 Result a 而不会构建 Decision [DecisionTree a]

我是完全关闭还是关闭?

这是 []free monad。因此,虽然可能有多种方法来定义一个 monad 实例(根据@leftroundabout),但有一种规范的方法来定义一个自由的 monad 实例,这是您选择的那个。 (您可以将您的实现与 Free 的实现进行比较,发现它们是等效的。唯一的区别是您将 f 的选择固定为 []。)

but this only builds Result a and no Decision [DecisionTree a].

我不确定这是什么意思,但是产生 Decision 的箭头 a -> DecisionTree b 将产生 Decisionreturn 将始终生成 Result,但这是预期的。