我正在尝试为游戏制作决策树,我有:
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]
。
我完全离开了还是我离开了?
答案 0 :(得分:4)
这是[]
的{{3}}。因此,虽然可能有多种方法来定义monad实例(根据@leftroundabout),但有一种规范方法可以定义一个自由monad实例,这是您选择的实例。 (您可以将您的实施与Free
的实施进行比较,看看它们是否相同。唯一的区别是您将f
的选项修改为[]
。)
但这仅构建
Result a
而不构建Decision [DecisionTree a]
。
我不确定这意味着什么,但产生a -> DecisionTree b
的箭头Decision
会产生Decision
。 <{1}}将始终生成return
,但这是预期的。