haskell - 实现 `Applicative (Free f)`

标签 haskell

对于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 xpure 的正确定义.

但是,无论这是否正确,我不确定如何实现<*> .

特别是以下几种情况是否需要支持?请注意,我忽略了 Var 的构成。和Node_ .

(Var _) <*> (Var _)
(Var _) <*> (Node _)
(Node _) <*> (Var _)
(Node _) <*> (Node _)

请提示我以上情况是否需要匹配。

另外,请向我提供一个关于这对 Free f a 意味着什么的直觉。实例存在于 <*> 的两侧.

最佳答案

Will Ness 使用 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 软件包的最新版本使用此定义,以便尽可能明确。)

chi showed ,前两种情况可以合并:

  A f <*> x = f <$> x

关于haskell - 实现 `Applicative (Free f)`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27527703/

相关文章:

haskell - 编译器开关打开/关闭调试消息?

haskell - 为什么这个新类型没有被赋予正确的 Read 实例?

haskell - “= ” Haskell输入错误

haskell - 转变减少快乐语法中的冲突

exception - 从 Haskell 程序中的堆栈溢出或堆耗尽中恢复

arrays - Haskell 实时更新和查找性能

haskell - 这种表达式抽象支持哪些数学运算?

haskell - 是否有 “dual”用于缩放?

haskell - Data.Map中键/值关系的静态保证

haskell - 在 Haskell 中使用元组定义递归数据类型