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

scala - Cats Free foldMap 未找到隐式 Monad

我有一个自然转换的解释器MyADT ~> MyState

我什么时候都没有问题type MyState[A] = State[MyClass, A]。但是,如果我有type MyState[A] = State[MyClass, M[A]],其中 M 是任何单子,那么我会收到错误:could not find implicit value parameter M: cats.Monad[MyState]调用foldMap.

问题是什么?

0 投票
1 回答
77 浏览

scala - 我如何使用 Scalaz 链接动作并解释它们?

我正在尝试学习如何使用 FreeMonads 为我的服务实现解释器。

假设我有

和一个动作的单子

接下来,我这样定义我的服务:

与每个对象

LogServiceInterpreter的是这样的:

同样,我PointAccuralServiceInterpreter的也是这样的:

我的逻辑很简单,我想记录并使用我的命令,然后创建一个事件,有点像事件源:

这段代码实际上甚至没有编译。

我应该从这里做什么?我想我应该使用 Coproduct 链接它们并通过提供我的解释器来执行这段逻辑。

我在这里找到了一些东西 https://groups.google.com/forum/#!topic/scalaz/sHxFsFpE86c

或者据说我可以使用 Shapeless 来做到这 一点在 Scala 中使用 Shapeless 折叠不同类型的列表

它们都太复杂了。我想要的是,在我定义了我的逻辑之后,我该如何执行它?

希望我在这里提供足够的详细信息以获得答案。我真的很想学这个。谢谢

0 投票
3 回答
759 浏览

scala - 自由单子的条件行为

我在这里学习教程:http: //typelevel.org/cats/datatypes/freemonad.html并尝试修改它以使用键值存储前面的缓存。到目前为止,这是我想出的,但我遇到了编译器错误valueGetOperation。我明白为什么会出现编译错误,只是不明白如何解决它。使用免费单子时条件行为的最佳实践是什么?

0 投票
1 回答
781 浏览

f# - F# 中具有通用输出类型的免费 Monad

我正在尝试应用F# 中描述的免费 monad 模式来实现数据访问(用于 Microsoft Azure 表存储)

例子

假设我们有三个数据库表和三个 dao 的 Foo、Bar、Baz:

我想选择带有 key="foo" 的 Foo 和带有 key="bar" 的 Bar 来插入带有 key="baz" 和 col=3 的 Baz

在解释器功能内

  • Select导致一个函数调用,它接受 akey : string并返回一个obj
  • Insert导致一个接受obj并返回的函数调用unit

问题

我定义了两个操作SelectInsert除了Done终止计算:

为了链接 StoreOp,我正在尝试实现正确的绑定功能:

但是,f# 编译器正确地警告我:

对于 bindOp 的这个实现,类型在整个计算过程中是固定的,所以不是:

我只能表达:

我应该如何修改 StoreOp 和/或 bindOp 的定义以在整个计算过程中使用不同的类型?

0 投票
1 回答
96 浏览

haskell - 当一个不匹配时,为什么我会收到“重叠实例”错误?

我试图允许在我的 Free monad 中嵌入一个 state monad;这是我的简单尝试:

我得到错误:

据我所知;它正在尝试应用此实例:

这里的免费包中;但是在这种情况下,它必须匹配Free (Toy s)并且没有MonadState s (Toy s)要求,所以我不明白为什么它认为它适用。

如果我删除我的实例定义,我会得到:

这支持了我的想法,即另一个实例实际上并不适用;如何使用我指定的实例进行编译?你能解释为什么会这样吗?是因为FlexibleInstances被使用了吗?

谢谢!

0 投票
1 回答
179 浏览

haskell - 在 Free Monad 上缩放实例

我正在尝试构建一个免费的 monad(使用free),它的作用就像 StateT monad,但它允许您也可以在 base state 上运行 monad AppState。我有一个单独的构造函数LiftAction来保存这些类型。这个想法是你一直zoom保持 Actions 直到它们到达 AppState,它可以在它的扩展映射中存储不同的状态。

这是我之前使用 mtl 的尝试(失败):Lift through nested state transformers (mtl)

无论如何,因为它基本上是一个包装器,StateT所以我给了它一个MonadState实例,但现在我正在努力添加使用镜头库缩放 monad 状态的能力;我遇到了一些奇怪的编译器错误,我无法理解(镜头错误通常对用户不太友好)。

这是我的代码和初步尝试:

我收到错误:

据我所知,它变得很困惑,因为 StateT 嵌入在 Free 构造函数中,并且它丢失了a.

我以前通过定义我自己的缩放函数有一个工作版本,它在给定“镜头”的情况下缩放底层 StateT,但诀窍是我希望它也可以与Traversal's 一起使用,所以最干净的方法是编写缩放实例.

任何人都知道如何编译它?提前致谢!!如果可能的话,请在发布之前尝试编译您的答案,谢谢!

0 投票
2 回答
226 浏览

scala - 将 OOP“装饰器”重构为 Free monad 结构

我有一些“遗留”的 Scala 代码(类似 Java),它进行一些数据访问。有一个装饰器可以跟踪 DAO 方法(收集指标)的使用情况,如下所示:

我正在尝试将其建模为 Free monad。我为 DAO 操作定义了以下代数:

我看到两个选项:

a)我可以制作两个解释器DBOp,一个执行实际的数据访问,另一个执行跟踪,并将它们组合在一起,或者
b)我使 Tracking 成为一个显式代数,并使用 Coproduct 在同一个for组合中使用它们或者
c) 完全不同的东西!

第一个选项看起来更像是一种“装饰器”方法,它与 绑定DBOp,第二个是更通用的解决方案,但需要显式调用“跟踪”代数。

另外,请注意source原始fetchById调用中的参数:它仅用于跟踪。我宁愿从 API 中删除它。

这是实际的问题:我如何为跟踪建模?

0 投票
1 回答
608 浏览

haskell - 如何编写基于免费 monad 的 DSL?

我正在使用 Haskell 中的免费 monad,但我一直在定义提升 Free monad 中的函子构造函数的函数。

我将 AppF 函子作为几个函子的总和,每个函子代表一个效果。这些函子之一是 DbTrF,代表 db 交易效果。

所以我的 AppF 是这样定义的:

我的 DbTrF 定义如下:

那么我想要一个交易功能

...我想这样使用:

为此,我想介绍 Table 类型作为接受操作并返回 DbTrF 值的函数:

我的尝试是这样的:

但我不确定该放什么而不是问号。

这是一个很好的方向还是我做错了?

谢谢!

0 投票
2 回答
513 浏览

scala - 带有 Coproduct 和 monad 转换器的 Scala Free Monads

我正在尝试在我的项目中开始使用免费的 monad,我正在努力让它变得优雅。
假设我有两个上下文(实际上我有更多) -Receipt并且User- 两者都对数据库进行操作,我希望将它们的解释器分开并在最后一刻组合它们。
为此,我需要为每个操作定义不同的操作,并使用Coproduct.
这是我经过几天的谷歌搜索和阅读后得到的:

当我想编写一个程序时,我可以这样做:

这里的问题是,例如userfor comprehension 的类型是可以通过签名Either[Error, User]来理解的。getUser

我想要的是User输入或停止计算。
我知道我需要以某种方式使用EitherTmonad 转换器或FreeT,但经过数小时的尝试,我不知道如何组合这些类型以使其工作。

有人可以帮忙吗?如果需要更多详细信息,请告诉我。

我还在这里创建了一个最小的 sbt 项目,所以任何愿意帮助的人都可以运行它:https://github.com/Leonti/free-monad-experiment/blob/master/src/main/scala/example/FreeMonads。斯卡拉

干杯,莱昂蒂

0 投票
1 回答
147 浏览

purescript - Defining an interpreter for the free monad

In the purescript-free package, there is a code example defining this interpreter:

How can I define and run another interpreter where the return type is Array Int or State String Int?