问题标签 [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.
f# - 试图让绑定为状态和延迟单子的组合工作
如果这个问题的答案是“你做错了”,一定要让我知道一个更合适的方法。我的代码结构如下:
现在这种类型主要是直接使用的,有很多内联代码进行手动绑定,这是我试图摆脱的很多样板,所以我想我把它变成一个计算表达式。正确获取map、bind和apply并不难。
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 )中也注意到了这一点:
也许我遵循了我不应该遵循的模式,但当时这似乎是个好主意,尤其是在尝试重构大量样板代码并用计算表达式替换它时,但也许我应该坚持直接评估,它适合在我脑海中 ;)。
但我觉得我很接近......有什么想法吗?
haskell - 汽车、箭头和自由单子
我已经阅读了两篇关于Autos和Free Monads的精彩系列文章,我想以某种方式将这两种技术结合起来。
我想要类似的东西:
但是有一些问题,例如,据我所知,ArrowLoop
要求Program
是一个不可能的实例。MonadFix
所以我的问题是:
- 有没有办法一起制作
Auto
和Free
工作? - 如果没有,也许还有其他方法可以实现目标?
注意:我对函数式编程还很陌生,所以我对理论上的了解几乎没有。
更新:
在其中一个评论中提到,Auto
它本身就是一种固定点,我可以ProgramF
直接使用它。所以我猜想的类型Auto
应该是这样的:
但现在的问题是我不知道如何组合两个Auto
s 而f
不是Monad
.
我的最终目标是拥有一些具有内部状态的可组合代码片段,以及一种净化我的代码的方法,将所有IO
效果(如log
or getLine
)隐藏在某种解释器中。
所以我想我真正的问题是:我怎样才能实现上面描述的东西?
也许我做错了,有更好的方法。有人可以举一个简单的例子或提供一些类似的链接吗?
haskell - 可视化自由单子
我想我对 free monad 是什么有一个粗略的了解,但我希望有一种更好的方式来可视化它。
自由岩浆只是二叉树是有道理的,因为这就像你可以做到的那样“一般”而不会丢失任何信息。
同样,自由幺半群只是列表是有道理的,因为操作的顺序并不重要。现在“二叉树”中存在冗余,因此如果有意义的话,您可以将其展平。
出于类似的原因,自由组看起来像分形是有道理的:https ://en.wikipedia.org/wiki/Cayley_graph#/media/File:Cayley_graph_of_F2.svg 为了获得其他组,我们只需识别不同的元素该组的“相同”,我们得到其他组。
我应该如何可视化免费的单子?现在,我只是认为它是你能想象到的最通用的抽象语法树。本质上是这样吗?还是我过于简单化了?
同样,从自由单子到列表或其他单子,我们会失去什么?我们确定什么是“相同的”?
我感谢所有阐明这一点的评论。谢谢!
scala - 为什么我们需要 Free monad 来解释 Action 到 Future
我写了一个例子来使用 scalaz.Free 来将 Action 映射到 Future,它看起来很酷。但是,我试图了解它的好处。我希望我能在这里得到答案。这是我的代码片段
首先,我创建了一个 Action,即 AST。
然后,我创建了一个类,使用 Scalaz Free 和 Coyonda 将 Action 映射到 ASTMonad。
最后,我创建了一个解释器来将 Action 解释为 Future
当我运行它时,我可以使用
它似乎有效,我想我理解这个单子和解释器的东西。但是,我在想如果我直接使用Future.flatmap和map与解决方案相比有什么好处?
使用 Future flatmap 和 map 的代码对我来说看起来更简单。那么回到我的问题,我们是否需要使用 Free monad 来将业务逻辑解释给 Future,因为 Future 已经提供了 flatMap 和 map。如果是这样,有人可以给我更具体的例子,所以我可以看到好处吗?
提前致谢
haskell - 打印自由单子
可以将一个免费的 monad 转换为任何其他 monad,但是给定一个 type 的值Free f x
,我想打印整个树,而不是将生成的 AST 的每个节点映射到另一个 monad 中的某个其他节点。
Gabriel Gonzales直接使用该值
可以抽象为
Choice x = Choice x x
如果我们有像(用作仿函数)这样的多态函数,这很容易调用
但这对于一个简单的操作来说似乎相当复杂......还有哪些其他方法可以从f x -> b
到Free f x -> b
?
haskell - 如何使用自由(或更自由)的单子对采用单子参数的动作进行编码?
大多数 monadic 函数采用纯参数并返回一个 monadic 值。但是有一些也需要单子参数,例如:
他们每个人似乎都提出了一个不同的问题,我无法掌握如何使用自由单子对这些动作进行编码的通用方法。
在两者中
finally
,forkIO
问题在于一元参数的类型与结果不同。但是免费的人需要它们是相同的类型,因为IO a
被编码类型的类型变量替换,比如data MyFunctor x = Finally x x x
,它只会 encodeIO a -> IO a -> IO a
。在33 行 Haskell 代码中从零到协作线程作者
Fork next next
用来拳头实现然后用它来实现
其中输入和输出具有不同的类型。但我不明白这是使用某些过程得出的,还是只是一个适用于这个特定目的的临时想法。
mplus
特别令人困惑:天真的编码为分布
>>=
,建议更好的实现更复杂。并且从 free 中删除了 free 的本机MonadPlus
实现。在更自由的情况下,它是通过添加来实现的
为什么是
MPlus
NonDetEff Bool
而不是NonDetEff a a
?除了使用CoYoneda 函子之外,有没有办法让它与Free
我们需要数据类型成为函子一起工作?- 因为
forkExec
我根本不知道如何进行。
haskell - 自由单子总是存在吗?
我们从范畴论中知道,并非Set中的所有内函子都承认一个自由单子。典型的反例是幂集函子。
但是 Haskell 可以将任何函子变成一个自由的单子。
是什么让这个构造适用于任何 Haskell 仿函数但在Set中分解?
haskell - 自由单子和自由操作
描述 Free monad 的一种方法是说它是(某种类别的)内函子类别中的初始C
幺半群,其对象是从C
到的内函子C
,箭头是它们之间的自然转换。如果我们认为C
是Hask
,则内函子就是haskell中所说Functor
的,它是函子* -> *
,*
代表的对象Hask
初始时,从 endofunctort
到 monoidm
的任何映射都会End(Hask)
引发从Free t
到的映射m
。
换句话说,任何从 Functort
到 Monadm
的自然转换都会引发从Free t
到m
我本来希望能够编写一个函数
但这无法统一,而以下工作
或其带有签名的概括
我在范畴论中犯了错误,还是在翻译到 Haskell 时犯了错误?
我很想在这里听到一些智慧..
PS:启用该代码的代码
haskell - 在 Purescript 中操作自由单子
为什么要隐藏“视图”数据结构和相关的运算符Control.Monad.Free
等?purescript-free
FreeView
toView
使用通常的 Free Monad 公式 -
并给定一个仿函数,例如-
我可以编写一些简单(虽然丑陋)的代码来折叠链式 PutStrLn 调用,如下所示 -
在不使用任何实际数据构造函数的情况下,是否collapseChained
可以使用 Purescript 导出的函数?Control.Monad.Free