问题标签 [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 投票
1 回答
583 浏览

haskell - 是否存在渐近优化一系列 MonadPlus 操作的 Codensity MonadPlus?

最近有一个关于DList<->[]Codensity<->之间关系的问题Free

这让我思考是否有这样的事情MonadPlusCodensitymonad 仅对 monadic 操作提高渐近性能,对mplus.

此外,虽然曾经有Control.MonadPlus.Free,但它已被删除以支持FreeT f []. 而且由于没有明确的 free MonadPlus,我不确定如何表达相应的improve变体。也许像

?


更新:我尝试使用回溯LogicTmonad 创建这样的 monad,它似乎以类似于以下方式定义Codensity

并且适用于回溯计算,即MonadPlus.

然后我定义lowerLogic了,类似lowerCodensity如下:

然后,补充相应的MonadFree实例后

可以定义

但是,它有些不对劲,从我最初的实验看来,对于某些示例,k它与improvePlus k. 我不确定,如果这是一个基本的限制,LogicT并且需要一个不同的、更复杂的 monad,或者只是我lowerLogic错误地定义(或其他东西)。

0 投票
1 回答
271 浏览

haskell - 每个免费的单子都超过 ??? 函子产生一个comonad?

这个对“单子可以是共单子吗?”的回答中 我们看到

每个替代函子上的Cofree Comonad都会产生一个 Monad。

什么是双重的?是否有一类函子可以自动使自由单子成为共单子?

0 投票
1 回答
234 浏览

scala - 通过 scalaz 中的 Kleisli 箭头组合函数时,无法在 Coyoneda 上找到 Free Monads 的 Bind 实例

预先感谢您的帮助

我有 2 个函数正在尝试通过 Kleisli 箭头编写。这些函数接受字符串并生成 FreeC。kleisli 箭头的创建没有问题,但编译器抱怨它找不到。为简单起见,我将删除一些代码:

出于某种原因,我得到的是这个编译错误:

感觉应该解决隐含问题,因为 FreeC 在实现 Bind 特征的 monad 实例中,并且我正在通过 import Free._ 导入所有 Free 隐含实例

我在这里想念什么?

先感谢您!

0 投票
1 回答
173 浏览

haskell - 如何利用 Free 的 MonadReader 实例?

我想在我使用 Free monad 创建的 DSL 中使用 Reader。

我注意到这里有一个免费的 MonadReader 实例:

https://hackage.haskell.org/package/free-4.12.1/docs/src/Control-Monad-Free.html#line-264

如果我尝试ask在用 EDSL 编写的程序内部调用,我会收到类型错误“No such instance MonadReader Free MyDSL”

我最终会想在我的 DSL 中使用其他 Monad,例如 MonadError 和 Logging monad,但 Reader monad 只是我尝试过的第一个。

0 投票
1 回答
175 浏览

haskell - 检查自由单子 AST 中的绑定结构

将这个简单的基本函子和其他机器用于具有约束条件的免费 monad:

这是一个简单的程序

它具有以下(手工制作的)AST:

我希望能够通过以下方式对绑定条款进行推理:

  • 查看PureAST 中的术语
  • 注意那里发生的绑定变量
  • 在 AST 中标注对应的绑定节点

如果不进行某种配对,直接通过 cofree comonad 注释自由 monad AST 似乎是不可能的,但您可以想象得到类似以下带注释的 AST(例如,通过Fix),其中出现的节点绑定变量用Pure注释Just True

那么:有没有办法以这种特别的方式检查这样的程序中的绑定?即,例如,在这个问题中没有引入不同的变量类型。

我怀疑这可能是不可能的。诸如此类的选项很有吸引力,但是要创建必需类型类(, , )的实例data-reify似乎非常困难或不可能。ProgFFoldableTraversableMuRef

这种直觉是正确的,还是有一些我没有考虑过的方法来做到这一点?请注意,我很乐意接受任何令人毛骨悚然的不安全或动态手段。

0 投票
1 回答
232 浏览

haskell - 如何将指定为自由 monad 的程序与预期指令的描述进行比较?

所以我正在尝试做一些新颖的事情(我认为),但我对 Haskell 类型级编程的经验不足,无法自己解决。

我有一个免费的单子,描述了一些要执行的效果(一个 AST,如果这是你滚动的方式),我想根据对预期效果的一些描述来解释它。

到目前为止,这是我的代码::

这就是“核心”代码。这是一个示例程序:

为了测试这个程序,我想使用一个函数runTest :: Free DSL a -> _ -> Maybe a,它应该像这样模糊地接受一个程序和一些“预期效果”的规范:

expect并通过将程序执行的每个效果与列表中的下一项进行匹配来解释程序。然后关联的值(每对中的第二项)应作为该效果的结果返回给程序。如果所有效果都匹配,则程序的最终结果应以Just. 如果某些内容不匹配,Nothing则应返回(稍后我将对其进行扩展,使其返回信息丰富的错误消息)。

当然这个expect元组是没有用的,因为它的类型是一个巨大的东西,我不能写一个通用runTest函数。我遇到的主要问题是我应该如何表示这个预期意图的序列,以便我可以编写一个函数,该函数适用于任何程序的任何序列Free DSL a

  1. 我隐约知道 Haskell 中的各种高级类型级功能,但我还没有经验知道应该尝试使用哪些东西。
  2. 我应该为我的expected序列使用 HList 或其他东西吗?

非常感谢任何有关事情的提示。

0 投票
4 回答
356 浏览

haskell - 用 Free 编写 Identity monad

在“点菜数据类型”中,Swierstra 写道,给定Free(他称之为Term),Zero您可以实现 Identity monad:

Term Zero现在是 Identity monad。我明白为什么会这样。问题是由于讨厌的约束,我永远不能Term Zero用作 Monad :Functor f =>

如何制作Zero仿函数?

这里似乎有一个技巧:因为Zero没有构造函数,Impure所以永远不能使用,所以永远不会调用Impurecase 。>>=这意味着fmap永远不会被调用,所以在某种意义上这是可以的:

问题是,这感觉像是作弊。我错过了什么?Zero实际上是一个函子吗?或者可能Zero不是 Functor,这是我们Free在 Haskell 中表达方式的一个缺点?

0 投票
1 回答
983 浏览

scala - 在 Scala 中的 Free Monad 中堆叠 monadic 效果

我正在学习 Scala 中的 Free monad,并且我整理了一个简单的代数示例,我可以使用猫将其提升为 Free monad。

这是我的代数

我可以像这样使用它

ConsultationOpto的提升Free是隐式执行的。

(缺少很多细节,完整的工作实现在这里:https ://github.com/gabro/free-api )

到目前为止一切顺利,但是如果我需要提取consultation.Get.

首先想到的是一个单子变换器,即类似

但它看起来很丑,而且感觉不对。

使用 Free monad 时堆叠 monadic 效果的美化方式(如果有的话)是什么?

0 投票
1 回答
214 浏览

purescript - Polymorphic instruction in Free Monad in Purescript

I'm trying to get this small piece of code to compile.

If I instead use "Number" instead of "a" in RFNewEvent, then everything compiles fine. But the moment I go "forall a." and replace "Number" with "a" it no longer compiles.

I get the following error message

Does anyone know how to make this work?

I'm using version 0.5.0 of purescript-free.

Edit

If I use the following

and substitute it into RFNewEvent, then it will compile. But I end up with an undesired type signature for newEvent.

Which lets me create an event, but lets me shoot different event values to the event stream instead of the same type of value. (missing forall a. now on newEvent)

I might of made a mistake.

The overall goal is to simulate SodiumFRP's interface using a Free Monad. Then plug in an existing JavaScript FRP library that works similar to Sodium via FFI when interpreting the Free Monad.

Is this possible?

0 投票
1 回答
125 浏览

scala - 在您的免费代数中进行流式传输的最佳方式是什么?

我一直在尝试使用 Free monads 创建 HTTP 客户端,类似于 Rúnar Bjarnason 在演讲中采用的方法,即价格合理的 monads 的可组合应用程序架构

到目前为止,我可以在这个片段中看到,https://bitbucket.org/snippets/atlassian-marketplace/EEk4X

它工作正常,但我并不完全满意。最大的痛点是需要对HttpOps将要嵌入的代数进行参数化,以允许请求和响应主体的流式传输。这使得通过简单地说不可能建立你的代数

如果你尝试,你会illegal cyclic reference从编译器中得到一个错误。为了解决这个问题,您可以使用案例类

这解决了循环引用问题,但引入了一个新问题。我们不再有Inject[InteractOps, App]现成的实例,这意味着我们不再有Interact[App]andHttpc[HttpcOps[App, ?]]实例,因此我们必须为我们的代数手动定义它们。对于像这样的小而简单的代数,这并不太繁重,但对于更大的东西,它可以变成很多样板。

是否有另一种方法可以让我们以更方便的方式包含流式传输和组合代数?