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

haskell - 我怎样才能使这个 Haskell ADT 派生显示?

ADT 是免费的单子:

我希望它派生Show出来,以便在使用它时可以将其打印出来。例如,如果我有以下内容:

就像现在一样,如果我添加deriving (Show)FreeADT,我会收到以下错误:

我想show aa生成一个可打印的字符串。这可能吗?

0 投票
1 回答
149 浏览

haskell - 使用免费的 monad 测试 Redis 调用

我正在尝试关注这篇博文,以便通过使用免费的 monad 将 Redis 请求的执行与它们的使用区分开来。为了使用 hedis 作为 Redis 客户端,我对提供的代码进行了一些小的更改,这些更改似乎是类型检查。不幸的是,我无法找到或编写满足 runTest 和 runRedis 函数的类型约束的类型类实例,并且当我使用 foo 调用 runTest 时出现以下错误。

存储/Types.hs

存储/实现.hs

主文件

0 投票
2 回答
213 浏览

haskell - FreeT生成的解释器monad转换器的MonadFix实例?

我有一个由以下生成的标准解释器单子变换器的简化版本FreeT

p是“提示”,并且r是“环境”......人们可以使用类似的东西来运行它:

我觉得这种类型或多或少只是StateT......如果有的话,Interactive p r IO我认为是IO......我认为......但是......好吧,无论如何,我的直觉说应该有一个很好的例子。

我试着写一个,但我似乎无法弄清楚。到目前为止,我最接近的尝试是:

我还尝试使用利用MonadFix实例的版本m,但也没有运气 -

任何人都知道这是否真的可能,或者为什么不是?如果是的话,我继续寻找的好地方是什么?


或者,在我的实际应用程序中,我什至不需要使用FreeT...我可以使用Free; 也就是说,haveInteractive只是一个 monad 而不仅仅是一个 monad 转换器,并且有

如果这种情况有可能而不是一般的 FreeT 情况,我也会很高兴:)

0 投票
2 回答
493 浏览

haskell - 使用免费的 monad 和 GADT 进行漂亮的打印

考虑由以下 GADT 定义的表达式函子:

其中Foo定义为

(a -> r)字段 in和(否则理想的)限制性 GADT 构造函数的组合ExprF似乎使编写漂亮的打印解释器变得不可能:

类型孔是人们所期望的:

似乎没有办法给延续一个它需要的类型的值。该类型被编码为f,而我正在使用的其他解释器都f以某种方式处理以提取适当类型的值。但通往String代表的道路似乎受阻。

我在这里缺少一些常见的成语吗?Expr如果确实有可能,如何漂亮地打印 的值?如果不可能,什么替代结构ExprF可以捕获相同的结构,但还支持漂亮的打印机?

0 投票
1 回答
316 浏览

haskell - 缩放和自由单子的困难

我正在使用免费的单子和镜头,使用免费的单子来创建我自己的 IO 单子版本:

我将它堆叠在一个状态单子的顶部,如下所示:FreeT MyIO (State GameState) a哪里GameState是:

现在,我想要的是一种PlayerStateGameState上下文“放大” a 的方法。像这样的东西:

但我收到了这个错误:

players . element i这个错误似乎与遍历的事实有关;如果我从中删除列表方面_players并使用普通镜头,那么代码就可以工作。

关于如何编写这个函数的任何想法?

0 投票
2 回答
380 浏览

scala - How to avoid stack overflow when using scalaz's free monad?

I had previously thought that part of the goal of the implementation was to avoid this very problem, so maybe I'm doing something obviously dumb?

Here is some code:

Note: I realize this is silly :) In practice, my command class has many commands, and I have a command which does this same loop...basically, poll some state, if true abort, if false, keep waiting.

I want to avoid the stack overflow that this causes... I THOUGHT this was already trampolined, but I guess I need to manually do it again? Is there a clean way to do it within the free monad way of thinking?

Update:

Thinking further on this, I think the issue isn't the sleep Free Monad but rather the Id.Id monad taht we bind into on evaluation... so I tried something like:

But the problem with this is that it will only evaluate one step. Ideally I would like runFC to block until some condition is satisfied (or in this case, to loop forever until I kill it, but without a stack overflow)

0 投票
1 回答
166 浏览

haskell - 处理可组合的自由 DSL 中的模糊类型

我正在使用freecompdata包(在精神上类似于Combining Free types )构建几个 DSL,它们应该可以基于“free monads”和“datatypes a la carte”进行组合。

虽然这适用于一些简单的 DSL,但在构造函数/命令不依赖于该类型参数的情况下,我被困在一个具有类型参数的 DSL 上,这会导致 GHC 出现模棱两可的类型参数错误。

为了澄清,这里有一些代码:

正如 GHC 所暗示的那样,试图让它与启用AllowAmbiguousTypes扩展一起工作并没有让我更进一步。我尝试在类型签名中添加一些forall a风格的东西,但无济于事。

有什么办法可以让这种模式起作用吗?

0 投票
0 回答
191 浏览

scala - 如果 F 是 Free[F[_], A] 中的函子,为什么“Free”是 monad

据我了解,如果 Foo 是单子,那么它也可以被证明是函子。但是,我不明白为什么在 free monad 中,如果 F 是 functor,Free[F[_], A] 中的 Free 是 monad,所以我们可以使用 monadic 操作来编写代码。

当我阅读此博客http://underscore.io/blog/posts/2015/04/14/free-monads-are-simple.html时提出了这个问题

在 scalaz 中,Coyoneda 使用类型类来呈现 Functor。

因此,如果提供 Coyoneda 实现,则 Free[Functor, A] 是 monad。

这是我为简单代码编写的代码。它工作得很好而且很酷,所以我们将执行和解释器分开,但是为什么 Free 变成了“免费”的单子

0 投票
4 回答
1482 浏览

haskell - 如何为 Free Monads 使用 Church 编码?

我一直在使用包中的数据Free类型。现在我正在尝试将其转换为使用但不知道如何映射函数。Control.Monad.FreefreeFControl.Monad.Free.Church

例如,一个简单的模式匹配函数使用Free如下所示 -

F我可以轻松地将其转换为通过转换为/从使用的函数Free-

但是我不知道如何在不使用toF和的情况下完成它fromF-

一定有一个我缺少的一般模式。你能帮我弄清楚吗?

0 投票
2 回答
312 浏览

haskell - Control.MonadPlus.Free 出了什么问题?

免费的MonadPlus定义为

已在免费4.6中删除,并带有以下注释(更改日志):

已删除Control.MonadPlus.Free。改用FreeT f [],结果是中规中矩。

问题是什么,特别是哪些法律不成立?