问题标签 [free-monad]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
331 浏览

haskell - Free Monad 的 MonadError 实例

我用 sum 数据类型创建了一个非常有用的 Free Monad。这抽象了对持久数据存储的访问:

我想创建DataStore一个实例,MonadError错误消息处理为(Free (Error str))

但是我遇到了重叠实例错误。

DataStore制作单子和实例的正确方法是MonadError什么?

0 投票
1 回答
4979 浏览

haskell - Haskell 中的 Cofree CoMonad 有哪些激励示例?

我一直在玩Cofree,并不能完全了解它。

例如,我想Cofree [] Num在 ghci 中玩,却找不到任何有趣的例子。

例如,如果我构造一个 Cofree 类型:

我希望extract a == 1,但我得到了这个错误:

和一种:

我能得到一些简单的例子,即使是微不足道的,关于如何使用 Cofree 和仿函数:[], or Maybe, or Either, 演示

  • extract
  • extend
  • unwrap
  • duplicate?

交叉发布:https ://www.reddit.com/r/haskell/comments/4wlw70/what_are_some_motivating_examples_for_cofree/

编辑:在 David Young 的评论的指导下,这里有一些更好的例子,说明我的第一次尝试被误导了,但是我仍然喜欢一些可以引导 Cofree 直觉的例子:

0 投票
2 回答
340 浏览

haskell - Profunctor 的自由单子的模拟

我们可以定义data Free f a = Pure a | Free (f (Free f a))等等Functor f => Monad (Free f)

如果我们定义 data T f a b = R a | S b | T (f a (T f a b))我们有一些类似的Mso Profunctor f => M (T f a),在哪里class Profunctor f where dimap :: (a -> b) -> (c -> d) -> f b c -> f a d

自从我注意到Data.Comp.Term.Context并且Free对于Data.Comp.Param.Term.Context.

0 投票
0 回答
117 浏览

haskell - 免费的 monad 扩展玩具示例

我正在尝试扩展此博客文章中解释的玩具示例。

我尝试添加的新内容是AnnoyingOutput a (String -> next)这将需要一些东西并返回字符串消息。我是结构,同时使用liftF函数将它提升到 Free monad 级别。请帮我填空,适当的解释是可观的。

编辑:添加示例

0 投票
1 回答
97 浏览

haskell - 扩大ocaml中的类型

我正在尝试在 ocaml 中编写一个免费的 monad 库,遵循来自 haskell 的Control.Monad.Free,但我在一个点上卡住了,在葫芦 Free 的实现中。

这是我的翻译尝试。

不幸的是,我收到一个错误,告诉我我没有正确扩大 g 的类型。

如果我不插入函数类型注释,一切正常,但是正如错误消息所说,我没有得到 f 的一般类型。问题出在哪里?如何扩大 f 的类型?

0 投票
0 回答
162 浏览

scala - Scala Cats:迭代一个自由单子的结果并为每个结果执行一个自由单子操作

可以说我有以下免费的单子定义:

现在我想检索所有集合名称,然后为每个集合名称执行 idsFromSet 操作。

我会这样描述它:

但这是不可能的,因为单子不能混入理解中。所以在'setName <- allSetNames'这一行上,编译器抱怨它被赋予了一个Set并且它想要一个Free。

通过环顾四周,单子变压器似乎是要走的路。但是有了这些信息,我真的迷失了,因为我能找到的带有 monad 转换器的示例似乎与我的示例相距太远,或者解释太抽象而无法在此示例中实现。因此,我们将不胜感激。

编辑:我更进一步,可以通过这样做来实现我的结果(我也意识到我想要扁平的 id,而不是 id 的集合):

0 投票
1 回答
321 浏览

scala - 优化自由单子

如果我有一个 value a: Free[Op, A],是否可以“展平”结构,a以便Op由自由 monad 绑定在一起的两个 s 可以折叠成一个?

上下文:我想在解释之前将其作为优化步骤执行,因为它的语义Op是它的操作是幂等的。因此,如果两个“连续”出现,则可以在不影响程序语义的情况下消除第二个。

0 投票
1 回答
224 浏览

haskell - 为什么编译器不能在 Free Applicative 示例中推断出 Functor 类型?


我将结束本教程,试图找出 Free Monad,作为练习,我也在尝试执行 Applicative 函数。老实说,我不确定这些错误应该是什么意思。

此外,我不确定 的类型签名data FixE f e = Fix (f (FixE f e)) | Throw e应该是什么。起初我认为f (FixE f e)应该是一个元组,但它似乎是一个参数,因此该(FixE f e)部分实际上是第一个的类型参数f。但如果是这种情况,f内部不应该FixE f e也需要一个类型参数吗?

编辑:

在任何事情之前,我不明白最后一部分。还有到底应该定义什么函子的实例?f在上面的定义中应该已经有了这个约束。

Edit2:也许你的意思是 FixE 应该有一个 Functor 实例。

这是我最好的镜头,但它抱怨第一行中的 f 型太僵硬了。

0 投票
1 回答
388 浏览

scala - 在 Scala+Cats 中使用带有 Free Monads 的任意树

我正在为语法创建一个库,它将有 2 种不同的解释:1)基于语法解析字符串 2)以语法定义的语言生成字符串。

该库使用猫将语法的 AST 创建为自由单子。然而,它似乎不是完美的选择,因为自由单子创建了一个类似于列表的 AST 表示,这对于语句列表来说非常好,但是语法远离语句列表,更接近于任意树结构。

我设法通过使用~运算符表示连接的 2 个语法来实现我的树。AST 是一个本身就是任意 AST 的语法列表。

我的问题是:在自由单子中递归 AST 子树的好方法是什么?

我当前的实现在这里:

特别注意,该Multi案例使用不安全递归(即不是尾递归)来递归解释子树。有一个更好的方法吗?

请点击这里查看源代码。

0 投票
1 回答
807 浏览

haskell - 使用免费的 monad 进行日志记录

这个问题与这篇文章有关

这个想法是定义一个 DSL 来操作云中的文件,并定义一个解释器的组合来处理不同的方面,例如与 REST 接口的通信和日志记录。

为了使这一点更具体,假设我们有以下定义 DSL 术语的数据结构。

我们定义函数来构建 CloudFiles 程序如下:

然后这个想法是用另外两个 DSL 来解释这个:

我设法使用以下类型定义了从 CloudFiles DSL 到 REST DSL 的自然转换:

然后给出一个形式的程序:

可以使用 REST 调用来解释程序,如下所示:

当试图使用日志定义对 DSL 的解释时,问题就出现了。在我上面提到的文章中,作者定义了一个带有类型的解释器:

Free LogF a我们定义了一个具有类型的解释器:

问题是这个解释器不能 foldFree像我上面那样结合使用。所以问题是如何解释 Free CloudFilesF a使用上面定义的函数logCloudfilesI的程序interpretLog ?基本上,我正在寻找构造一个类型的函数:

我可以用 REST DSL 做到这一点,但我不能用 usng 做到这一点logCloudfilesI

在这些情况下使用免费 monad 时采取的方法是什么?请注意,问题似乎在于,对于日志记录情况,我们无法为函数 in 提供任何有意义的值ListFiles来构建程序的延续。 然而,在作者使用的第二篇文章中,这在我当前的实现Halt中不起作用。