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

f# - 试图让绑定为状态和延迟单子的组合工作

如果这个问题的答案是“你做错了”,一定要让我知道一个更合适的方法。我的代码结构如下:

现在这种类型主要是直接使用的,有很多内联代码进行手动绑定,这是我试图摆脱的很多样板,所以我想我把它变成一个计算表达式。正确获取mapbindapply并不难。

State 是通过 DC 进行的,但是这样做很麻烦,所以我将其更改为以下内容,这是我在与 state monad 讨论中看到的常见签名。

然后我决定把它提升到一个新的水平并引入延迟单子(或最终或任何它的名字)。所以我改变了我的类型,使其递归:

我尝试了以下一些变体,但不断得到:

当统一 ''a' 和 'Res<'a> -> Res<'b>' 时,结果类型将是无限的

(通常在我不调用return时发生,即Res.E <|以下)

或者我似乎无法正确输入类型,以下(可以理解)引发类型错误,但我有一个盲点来修复它:

此表达式应具有类型“Res<'a>”,但此处具有类型“DC * Res<'a>”。

我知道签名应该是('a -> Res<'b>) -> Res<'a> -> XRes<'b>. 问题来自正确的递归,至少在我的脑海中。我什至不确定为什么要将结果提供给Res.E,据我所知,k延续应该已经返回这种类型。

另外,我目前的回报如下(跟随史蒂夫霍斯菲尔德):

但在一些帖子(特别是热闹的 Frankenfunctor )中也注意到了这一点:

也许我遵循了我不应该遵循的模式,但当时这似乎是个好主意,尤其是在尝试重构大量样板代码并用计算表达式替换它时,但也许我应该坚持直接评估,它适合在我脑海中 ;)。

但我觉得我很接近......有什么想法吗?

0 投票
0 回答
264 浏览

haskell - 汽车、箭头和自由单子

我已经阅读了两篇关于AutosFree Monads的精彩系列文章,我想以某种方式将这两种技术结合起来。

我想要类似的东西:

但是有一些问题,例如,据我所知,ArrowLoop要求Program是一个不可能的实例。MonadFix

所以我的问题是:

  • 有没有办法一起制作AutoFree工作?
  • 如果没有,也许还有其他方法可以实现目标?

注意:我对函数式编程还很陌生,所以我对理论上的了解几乎没有。

更新:

在其中一个评论中提到,Auto它本身就是一种固定点,我可以ProgramF直接使用它。所以我猜想的类型Auto应该是这样的:

但现在的问题是我不知道如何组合两个Autos 而f不是Monad.

我的最终目标是拥有一些具有内部状态的可组合代码片段,以及一种净化我的代码的方法,将所有IO效果(如logor getLine)隐藏在某种解释器中。

所以我想我真正的问题是:我怎样才能实现上面描述的东西?

也许我做错了,有更好的方法。有人可以举一个简单的例子或提供一些类似的链接吗?

0 投票
2 回答
1977 浏览

haskell - 可视化自由单子

我想我对 free monad 是什么有一个粗略的了解,但我希望有一种更好的方式来可视化它。

自由岩浆只是二叉树是有道理的,因为这就像你可以做到的那样“一般”而不会丢失任何信息。

同样,自由幺半群只是列表是有道理的,因为操作的顺序并不重要。现在“二叉树”中存在冗余,因此如果有意义的话,您可以将其展平。

出于类似的原因,自由组看起来像分形是有道理的:https ://en.wikipedia.org/wiki/Cayley_graph#/media/File:Cayley_graph_of_F2.svg 为了获得其他组,我们只需识别不同的元素该组的“相同”,我们得到其他组。

我应该如何可视化免费的单子?现在,我只是认为它是你能想象到的最通用的抽象语法树。本质上是这样吗?还是我过于简单化了?

同样,从自由单子到列表或其他单子,我们会失去什么?我们确定什么是“相同的”?

我感谢所有阐明这一点的评论。谢谢!

0 投票
1 回答
288 浏览

scala - 为什么我们需要 Free monad 来解释 Action 到 Future

我写了一个例子来使用 scalaz.Free 来将 Action 映射到 Future,它看起来很酷。但是,我试图了解它的好处。我希望我能在这里得到答案。这是我的代码片段

首先,我创建了一个 Action,即 AST。

然后,我创建了一个类,使用 Scalaz Free 和 Coyonda 将 Action 映射到 ASTMonad。

最后,我创建了一个解释器来将 Action 解释为 Future

当我运行它时,我可以使用

它似乎有效,我想我理解这个单子和解释器的东西。但是,我在想如果我直接使用Future.flatmapmap与解决方案相比有什么好处?

使用 Future flatmap 和 map 的代码对我来说看起来更简单。那么回到我的问题,我们是否需要使用 Free monad 来将业务逻辑解释给 Future,因为 Future 已经提供了 flatMap 和 map。如果是这样,有人可以给我更具体的例子,所以我可以看到好处吗?

提前致谢

0 投票
1 回答
192 浏览

haskell - 打印自由单子

可以将一个免费的 monad 转换为任何其他 monad,但是给定一个 type 的值Free f x,我想打印整个树,而不是将生成的 AST 的每个节点映射到另一个 monad 中的某个其他节点。

Gabriel Gonzales直接使用该值

可以抽象为

Choice x = Choice x x如果我们有像(用作仿函数)这样的多态函数,这很容易调用

但这对于一个简单的操作来说似乎相当复杂......还有哪些其他方法可以从f x -> bFree f x -> b

0 投票
1 回答
254 浏览

haskell - 如何使用自由(或更自由)的单子对采用单子参数的动作进行编码?

大多数 monadic 函数采用纯参数并返回一个 monadic 值。但是有一些也需要单子参数,例如:

他们每个人似乎都提出了一个不同的问题,我无法掌握如何使用自由单子对这些动作进行编码的通用方法。

  • 在两者中finallyforkIO问题在于一元参数的类型与结果不同。但是免费的人需要它们是相同的类型,因为IO a被编码类型的类型变量替换,比如data MyFunctor x = Finally x x x,它只会 encode IO a -> IO a -> IO a

    33 行 Haskell 代码中从零到协作线程作者Fork next next用来拳头实现

    然后用它来实现

    其中输入和输出具有不同的类型。但我不明白这是使用某些过程得出的,还是只是一个适用于这个特定目的的临时想法。

  • mplus特别令人困惑:天真的编码为

    分布>>=建议更好的实现更复杂。并且从 free 中删除了 free 的本MonadPlus 实现

    更自由的情况下,它是通过添加来实现的

    为什么是MPlus NonDetEff Bool而不是NonDetEff a a除了使用CoYoneda 函子之外,有没有办法让它与Free我们需要数据类型成为函子一起工作?

  • 因为forkExec我根本不知道如何进行。
0 投票
1 回答
96 浏览

monads - 自由单子是教堂数字吗?

一位评论员最近表示

自由单子是教堂数字——只是使用(endo-)函子而不是函数!

他继续解释这句话:

它们都是由 0 - n 次组成的 endofunct(ion|or)

我知道教堂数字是一组匿名函数组合,每个数字都有一个组合。我只是不明白这如何适用于 Free Monads。

我的问题是:自由单子是教堂数字吗?

0 投票
2 回答
606 浏览

haskell - 自由单子总是存在吗?

我们从范畴论中知道,并非Set中的所有内函子都承认一个自由单子。典型的反例是幂集函子。

但是 Haskell 可以将任何函子变成一个自由的单子。

是什么让这个构造适用于任何 Haskell 仿函数但在Set中分解?

0 投票
2 回答
251 浏览

haskell - 自由单子和自由操作

描述 Free monad 的一种方法是说它是(某种类别的)内函子类别中的初始C幺半群,其对象是从C到的内函子C,箭头是它们之间的自然转换。如果我们认为CHask,则内函子就是haskell中所说Functor的,它是函子* -> **代表的对象Hask

初始时,从 endofunctort到 monoidm的任何映射都会End(Hask)引发从Free t到的映射m

换句话说,任何从 Functort到 Monadm的自然转换都会引发从Free tm

我本来希望能够编写一个函数

但这无法统一,而以下工作

或其带有签名的概括

我在范畴论中犯了错误,还是在翻译到 Haskell 时犯了错误?

我很想在这里听到一些智慧..

PS:启用该代码的代码

0 投票
1 回答
423 浏览

haskell - 在 Purescript 中操作自由单子

为什么要隐藏“视图”数据结构和相关的运算符Control.Monad.Free等?purescript-freeFreeViewtoView

使用通常的 Free Monad 公式 -

并给定一个仿函数,例如-

我可以编写一些简单(虽然丑陋)的代码来折叠链式 PutStrLn 调用,如下所示 -

在不使用任何实际数据构造函数的情况下,是否collapseChained可以使用 Purescript 导出的函数?Control.Monad.Free