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
将产生 Decision
。 return
将始终生成 Result
,但这是预期的。
我正在尝试为游戏制作决策树并且我有:
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 noDecision [DecisionTree a]
.
我不确定这是什么意思,但是产生 Decision
的箭头 a -> DecisionTree b
将产生 Decision
。 return
将始终生成 Result
,但这是预期的。