For the Free Monad
:
data Free f a = Var a
| Node (f (Free f a))
我实施了instance Functor (Free f)
:
instance Functor f => Functor (Free f) where
fmap g (Var x) = Var (g x)
fmap g (Node x) = Node $ fmap (\y -> fmap g y) x
然后我尝试实施instance Applicative (Free f)
:
instance Functor f => Applicative (Free f) where
pure x = Var x
我的直觉是var x
的正确定义是pure
.
但是,无论这是否正确,我不确定如何实施<*>
.
特别是以下几种情况是否需要支持?请注意,我忽略了化妆Var
and Node
with _
.
(Var _) <*> (Var _)
(Var _) <*> (Node _)
(Node _) <*> (Var _)
(Node _) <*> (Node _)
请指点一下以上情况是否需要匹配。
另外,请向我提供一个关于这对两者意味着什么的直觉Free f a
实例存在于两侧<*>
.
威尔·尼斯给出了一个完全合法的答案ap
。如果你内联ap
,你最终会得到这样的结果:
instance Functor f => Applicative (Free f) where
pure = A
A a <*> A b = A $ a b
A a <*> F mb = F $ fmap a <$> mb
F ma <*> b = F $ (<*> b) <$> ma
(注:最新版本的free
包使用此定义以便尽可能明确。)
As 气显示 https://stackoverflow.com/questions/27527703/implementing-applicative-free-f#comment43484816_27527703,前两种情况可以合并:
A f <*> x = f <$> x
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)