问题标签 [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.
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
.
问题是什么?
scala - 我如何使用 Scalaz 链接动作并解释它们?
我正在尝试学习如何使用 FreeMonads 为我的服务实现解释器。
假设我有
和一个动作的单子
接下来,我这样定义我的服务:
和
与每个对象
我LogServiceInterpreter
的是这样的:
同样,我PointAccuralServiceInterpreter
的也是这样的:
我的逻辑很简单,我想记录并使用我的命令,然后创建一个事件,有点像事件源:
这段代码实际上甚至没有编译。
我应该从这里做什么?我想我应该使用 Coproduct 链接它们并通过提供我的解释器来执行这段逻辑。
我在这里找到了一些东西 https://groups.google.com/forum/#!topic/scalaz/sHxFsFpE86c
或者据说我可以使用 Shapeless 来做到这 一点在 Scala 中使用 Shapeless 折叠不同类型的列表
它们都太复杂了。我想要的是,在我定义了我的逻辑之后,我该如何执行它?
希望我在这里提供足够的详细信息以获得答案。我真的很想学这个。谢谢
scala - 自由单子的条件行为
我在这里学习教程:http: //typelevel.org/cats/datatypes/freemonad.html并尝试修改它以使用键值存储前面的缓存。到目前为止,这是我想出的,但我遇到了编译器错误valueGetOperation
。我明白为什么会出现编译错误,只是不明白如何解决它。使用免费单子时条件行为的最佳实践是什么?
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
问题
我定义了两个操作Select
,Insert
除了Done
终止计算:
为了链接 StoreOp,我正在尝试实现正确的绑定功能:
但是,f# 编译器正确地警告我:
对于 bindOp 的这个实现,类型在整个计算过程中是固定的,所以不是:
我只能表达:
我应该如何修改 StoreOp 和/或 bindOp 的定义以在整个计算过程中使用不同的类型?
haskell - 当一个不匹配时,为什么我会收到“重叠实例”错误?
我试图允许在我的 Free monad 中嵌入一个 state monad;这是我的简单尝试:
我得到错误:
据我所知;它正在尝试应用此实例:
从
这里的免费包中;但是在这种情况下,它必须匹配Free (Toy s)
并且没有MonadState s (Toy s)
要求,所以我不明白为什么它认为它适用。
如果我删除我的实例定义,我会得到:
这支持了我的想法,即另一个实例实际上并不适用;如何使用我指定的实例进行编译?你能解释为什么会这样吗?是因为FlexibleInstances
被使用了吗?
谢谢!
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 一起使用,所以最干净的方法是编写缩放实例.
任何人都知道如何编译它?提前致谢!!如果可能的话,请在发布之前尝试编译您的答案,谢谢!
scala - 将 OOP“装饰器”重构为 Free monad 结构
我有一些“遗留”的 Scala 代码(类似 Java),它进行一些数据访问。有一个装饰器可以跟踪 DAO 方法(收集指标)的使用情况,如下所示:
我正在尝试将其建模为 Free monad。我为 DAO 操作定义了以下代数:
我看到两个选项:
a)我可以制作两个解释器DBOp
,一个执行实际的数据访问,另一个执行跟踪,并将它们组合在一起,或者
b)我使 Tracking 成为一个显式代数,并使用 Coproduct 在同一个for
组合中使用它们或者
c) 完全不同的东西!
第一个选项看起来更像是一种“装饰器”方法,它与 绑定DBOp
,第二个是更通用的解决方案,但需要显式调用“跟踪”代数。
另外,请注意source
原始fetchById
调用中的参数:它仅用于跟踪。我宁愿从 API 中删除它。
这是实际的问题:我如何为跟踪建模?
haskell - 如何编写基于免费 monad 的 DSL?
我正在使用 Haskell 中的免费 monad,但我一直在定义提升 Free monad 中的函子构造函数的函数。
我将 AppF 函子作为几个函子的总和,每个函子代表一个效果。这些函子之一是 DbTrF,代表 db 交易效果。
所以我的 AppF 是这样定义的:
我的 DbTrF 定义如下:
那么我想要一个交易功能
...我想这样使用:
为此,我想介绍 Table 类型作为接受操作并返回 DbTrF 值的函数:
我的尝试是这样的:
但我不确定该放什么而不是问号。
这是一个很好的方向还是我做错了?
谢谢!
scala - 带有 Coproduct 和 monad 转换器的 Scala Free Monads
我正在尝试在我的项目中开始使用免费的 monad,我正在努力让它变得优雅。
假设我有两个上下文(实际上我有更多) -Receipt
并且User
- 两者都对数据库进行操作,我希望将它们的解释器分开并在最后一刻组合它们。
为此,我需要为每个操作定义不同的操作,并使用Coproduct
.
这是我经过几天的谷歌搜索和阅读后得到的:
当我想编写一个程序时,我可以这样做:
这里的问题是,例如user
for comprehension 的类型是可以通过签名Either[Error, User]
来理解的。getUser
我想要的是User
输入或停止计算。
我知道我需要以某种方式使用EitherT
monad 转换器或FreeT
,但经过数小时的尝试,我不知道如何组合这些类型以使其工作。
有人可以帮忙吗?如果需要更多详细信息,请告诉我。
我还在这里创建了一个最小的 sbt 项目,所以任何愿意帮助的人都可以运行它:https://github.com/Leonti/free-monad-experiment/blob/master/src/main/scala/example/FreeMonads。斯卡拉
干杯,莱昂蒂
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
?