haskell中的决策树定义>> =并返回

时间:2015-10-16 17:37:13

标签: haskell tree monads

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

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]

我完全离开了还是我离开了?

1 个答案:

答案 0 :(得分:4)

这是[]的{​​{3}}。因此,虽然可能有多种方法来定义monad实例(根据@leftroundabout),但有一种规范方法可以定义一个自由monad实例,这是您选择的实例。 (您可以将您的实施与Free的实施进行比较,看看它们是否相同。唯一的区别是您将f的选项修改为[]。)

  

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

我不确定这意味着什么,但产生a -> DecisionTree b的箭头Decision会产生Decision。 <{1}}将始终生成return,但这是预期的。