问题标签 [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 回答
614 浏览

haskell - 带有免费/可操作 Monad 变形金刚的 Monad 堆栈渗透类?

FreeT / ProgramT 创建的 monad 转换器是否有类似 mtl 的机制?

我对历史的理解如下。曾几何时,monad 转换器被发明了。然后人们开始一个接一个地堆叠 monad 转换器,然后发现lift到处都插入很烦人。然后有几个人发明了单子类,这样我们就可以ask :: m r在任何单子m中这样MonadReader r m。这可以通过让每个 monad 类渗透到每个 monad 转换器来实现,例如

(Monoid w, MonadState s m) => MonadState s (WriterT w m)
MonadWriter w m => MonadWriter w (StateT s m)

对于每对 monad 转换器,您都需要这样一对实例声明,因此当有n 个monad 转换器时,有n ^2 成本。然而,这并不是一个大问题,因为人们大多会使用预定义的 monad,而很少创建自己的。到目前为止我了解的故事,并且在以下问答中也有详细说明:

使用 Monad Transformers 避免升力

然后我的问题是新的 Free monads http://hackage.haskell.org/package/free和 Operational monads http://hackage.haskell.org/package/operational。它们允许我们编写自己的 DSL 并将其用作 monad,只需将语言定义为某种代数data类型(操作甚至不需要Functor实例)。好消息是我们可以免费获得 monad 和 monad 转换器;那么monad类呢?坏消息是“我们很少定义自己的 monad 转换器”的假设不再成立。

作为理解这个问题的尝试,我做了两个ProgramTs,让它们互相穿透;

https://github.com/nushio3/practice/blob/master/operational/exe-src/test-05.hs

operational包不支持 monad 类,因此我采用了另一个实现minioperational并对其进行了修改以根据需要进行工作;https://github.com/nushio3/minioperational

不过,我需要专门的实例声明

instance (Monad m, Operational ILang m) => Operational ILang (ProgramT SLang m) where

因为以下形式的一般声明会导致无法确定的情况。

instance (Monad m, Operational f m) => Operational f (ProgramT g m) where

我的问题是,我们怎样才能更容易让我们的操作单子相互渗透。或者,我是否希望对任何不合时宜的 Operational monad 有所了解。

我也想知道正确的渗透技术术语:)

0 投票
1 回答
921 浏览

scala - Stackless Scala 和 Free Monads,完整示例

以下代码改编自一篇论文(RO Bjarnason,Stackless Scala With Free Monads)。

论文的标题指出了所提出的数据结构的总体目的——即在恒定堆栈空间中提供递归处理,并让用户以清晰的方式表达递归。

具体来说,我的目标是拥有一个单子结构,它可以在上升时基于恒定堆栈空间中的简单模式匹配对不可变的对树(二叉树)或列表(n-ary-tree)进行结构重写。

使用 Free 是如何实现重写的?

模式匹配器的钩子在哪里?- 模式匹配器在上升时必须暴露给每个完整的子树!

这可以在 for 块内完成吗?

[问题已编辑。]

0 投票
1 回答
167 浏览

haskell - 来自 Free 和 MonadFree 的箭头

如何创建ArrowfromFreeMonadFree

MonadFree 包含 2 个参数mf,但Kleisli没有空间可插入f,所以我们不能使用Kleisli箭头 for MonadFree

据我了解,需要创建一个类、一个新类型和一个实例,如下所示:

但看起来实现并不简单

0 投票
1 回答
177 浏览

haskell - Control.MonadPlus.Free 没有不必要的分发

我正在尝试使用一个免费的 monad 来构建一个 EDSL,用于构建像 Prolog 这样的 AND/OR 决策树,>>=映射到 AND,并mplus映射到 OR。我希望能够描述类似的东西A AND (B OR C) AND (D OR E),但我不希望分配性把它变成(A AND B AND D) OR (A AND B AND E) OR (A AND C AND D) OR (A AND C AND E). 最终,我想将 AND/OR 节点转换为约束求解器中的具体约束,而不会导致我希望求解器处理的备选方案数量的组合爆炸。

in Control.MonadPlus.Free,Plus ms >>= f导致f应用于Pure每个 monad 下的每个叶子ms。这是必要的,因为它可能会为它替换f的每个叶子产生不同的值。Pure

但是,在 中Plus ms >> gg不受 的任何叶子影响ms,因此将其分布在 中Plus似乎没有必要。

通过反复试验,我发现我可以Control.MonadPlus.Free使用新的Then构造函数来扩展 monad:

在这里,新的Then构造函数包含一系列我们忽略其值的 monad,然后是产生实际值的最终 monad。新Monad实例如下所示:

操作符通过替换为“>>封顶”任何现有叶子,将封顶的 monad 附加到列表中,并将值 monad 替换为新的。我知道将新 monad 附加到 的效率低下,但我认为它与将其新 monad 缝合到链的末尾一样糟糕(并且整个事情可以使用延续来重写)。Pure aPure ()++>>=fmap

这似乎是一件合理的事情吗?这是否违反单子定律(这有关系吗?),还是有更好的方法来使用现有的Control.Monad.Free

0 投票
3 回答
1433 浏览

clojure - Is it possible to do the Free Monad in Clojure?

There has been some outstanding work with Monads in Clojure by Konrad Hinsen, Jim Duey and Leonardo Borges.

My question is - is it possible to do the Free Monad in Clojure?

This is an example in Haskell from an article on Scala:

This is the corresponding Scala example

0 投票
5 回答
1720 浏览

haskell - 是否可以扩展免费的 monad 解释器?

给定一个免费的 monad DSL,例如:

和一个随机解释器Foo

在我看来,应该可以在 printFoo 的每次迭代中散布一些东西,而无需手动进行:

这是否可以通过“包装”原件来实现printFoo


动机:我正在编写一个“编译”为二进制格式的小型 DSL。二进制格式在每个用户命令之后包含一些额外的信息。它必须在那里,但在我的用例中完全无关紧要。

0 投票
1 回答
637 浏览

haskell - 证明自由单子的函子定律;我做对了吗?

我很难理解如何证明自由单子的FunctorMonad定律。首先,让我提出我正在使用的定义:

如果我理解正确,等式证明需要诉诸一个共归纳假设,它或多或少像这个例子:

我已经强调了我不确定自己是否做对的步骤。

如果这个证明是正确的,那么Free第二定律的构造函数案例的证明如下:

0 投票
2 回答
1922 浏览

haskell - 结合自由类型

我最近一直在自学免费Free包中的monad ,但我遇到了一个问题。我想为不同的库提供不同的免费 monad,本质上我想为不同的上下文构建 DSL,但我也希望能够将它们组合在一起。举个例子:

现在,我希望能够创建一种类型,使我能够轻松地BellsAndWhistles将两者的功能结合起来。BellsWhistles

由于问题在于组合 monad,我的第一个想法是查看Control.Monad.Trans.Free模块以获得快速简便的解决方案。不幸的是,有很少的例子,没有一个显示我想要做什么。此外,似乎堆叠两个或多个免费 monad 不起作用,因为MonadFree具有m -> f. 本质上,我希望能够编写如下代码:

但是以这样的方式,Bells并且Whistles可以存在于单独的模块中,并且不必了解彼此的实现。我的想法是我可以为不同的任务编写独立的模块,每个模块都实现自己的 DSL,然后根据需要将它们组合成“更大”的 DSL。是否有捷径可寻?

作为奖励,能够利用play*已经编写的不同函数,以这样一种方式,我可以将它们交换出来,这将是很棒的。我希望能够使用一个免费的解释器进行调试,另一个用于生产,并且能够选择单独调试哪个 DSL 显然很有用。

0 投票
1 回答
1005 浏览

haskell - 免费 monad 的应用实例

在尝试找到可以逐步执行/允许线程的haskell monad时,我发现了免费的monad

及其 monad 实例

及其函子实例

我知道每个 monad 都是一个带有pure = returnand的应用函子(<*>) = ap。对我来说,应用函子在概念上比单子更难。为了更好地理解应用函子,我喜欢使用应用实例而不使用ap.

第一行<*>很简单:

如何用和定义Roll f <*> x基本术语?fmap<*>

0 投票
1 回答
282 浏览

haskell - 是否可以扩展免费的单子解析器?

这是对是否可以扩展免费的单子解释器的后续行动或者反过来更好。

我最近重新审视了上一个问题所源自的项目。这次我尝试将文件解析为数据结构。

问题是我不知道如何实现这一目标。虽然编写他(cereal基于)解析器是没有问题的,只要我只解析到FooF类型,它就可以工作,我不知道如何创建交错的Functor(正确的术语?)。

笔记:

  • 在这一点上,我只是在寻找有关如何实现这一目标的线索。
  • 我还没有可以提供的代码。
  • 请参阅链接问题中的代码和数据类型的接受答案。