问题标签 [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.
haskell - Free Monad 的 MonadError 实例
我用 sum 数据类型创建了一个非常有用的 Free Monad。这抽象了对持久数据存储的访问:
我想创建DataStore
一个实例,MonadError
错误消息处理为(Free (Error str))
:
但是我遇到了重叠实例错误。
DataStore
制作单子和实例的正确方法是MonadError
什么?
haskell - Haskell 中的 Cofree CoMonad 有哪些激励示例?
我一直在玩Cofree
,并不能完全了解它。
例如,我想Cofree [] Num
在 ghci 中玩,却找不到任何有趣的例子。
例如,如果我构造一个 Cofree 类型:
我希望extract a == 1
,但我得到了这个错误:
和一种:
我能得到一些简单的例子,即使是微不足道的,关于如何使用 Cofree 和仿函数:[]
, or Maybe
, or Either
, 演示
extract
extend
unwrap
duplicate
?
交叉发布:https ://www.reddit.com/r/haskell/comments/4wlw70/what_are_some_motivating_examples_for_cofree/
编辑:在 David Young 的评论的指导下,这里有一些更好的例子,说明我的第一次尝试被误导了,但是我仍然喜欢一些可以引导 Cofree 直觉的例子:
haskell - Profunctor 的自由单子的模拟
我们可以定义data Free f a = Pure a | Free (f (Free f a))
等等Functor f => Monad (Free f)
。
如果我们定义
data T f a b = R a | S b | T (f a (T f a b))
我们有一些类似的M
so Profunctor f => M (T f a)
,在哪里class Profunctor f where dimap :: (a -> b) -> (c -> d) -> f b c -> f a d
?
自从我注意到Data.Comp.Term.Context
并且Free
对于Data.Comp.Param.Term.Context
.
haskell - 免费的 monad 扩展玩具示例
我正在尝试扩展此博客文章中解释的玩具示例。
我尝试添加的新内容是AnnoyingOutput a (String -> next)
这将需要一些东西并返回字符串消息。我是结构,同时使用liftF
函数将它提升到 Free monad 级别。请帮我填空,适当的解释是可观的。
编辑:添加示例
haskell - 扩大ocaml中的类型
我正在尝试在 ocaml 中编写一个免费的 monad 库,遵循来自 haskell 的Control.Monad.Free,但我在一个点上卡住了,在葫芦 Free 的实现中。
这是我的翻译尝试。
不幸的是,我收到一个错误,告诉我我没有正确扩大 g 的类型。
如果我不插入函数类型注释,一切正常,但是正如错误消息所说,我没有得到 f 的一般类型。问题出在哪里?如何扩大 f 的类型?
scala - Scala Cats:迭代一个自由单子的结果并为每个结果执行一个自由单子操作
可以说我有以下免费的单子定义:
现在我想检索所有集合名称,然后为每个集合名称执行 idsFromSet 操作。
我会这样描述它:
但这是不可能的,因为单子不能混入理解中。所以在'setName <- allSetNames'这一行上,编译器抱怨它被赋予了一个Set并且它想要一个Free。
通过环顾四周,单子变压器似乎是要走的路。但是有了这些信息,我真的迷失了,因为我能找到的带有 monad 转换器的示例似乎与我的示例相距太远,或者解释太抽象而无法在此示例中实现。因此,我们将不胜感激。
编辑:我更进一步,可以通过这样做来实现我的结果(我也意识到我想要扁平的 id,而不是 id 的集合):
scala - 优化自由单子
如果我有一个 value a: Free[Op, A]
,是否可以“展平”结构,a
以便Op
由自由 monad 绑定在一起的两个 s 可以折叠成一个?
上下文:我想在解释之前将其作为优化步骤执行,因为它的语义Op
是它的操作是幂等的。因此,如果两个“连续”出现,则可以在不影响程序语义的情况下消除第二个。
haskell - 为什么编译器不能在 Free Applicative 示例中推断出 Functor 类型?
我将结束本教程,试图找出 Free Monad,作为练习,我也在尝试执行 Applicative 函数。老实说,我不确定这些错误应该是什么意思。
此外,我不确定 的类型签名data FixE f e = Fix (f (FixE f e)) | Throw e
应该是什么。起初我认为f (FixE f e)
应该是一个元组,但它似乎是一个参数,因此该(FixE f e)
部分实际上是第一个的类型参数f
。但如果是这种情况,f
内部不应该FixE f e
也需要一个类型参数吗?
编辑:
在任何事情之前,我不明白最后一部分。还有到底应该定义什么函子的实例?f
在上面的定义中应该已经有了这个约束。
Edit2:也许你的意思是 FixE 应该有一个 Functor 实例。
这是我最好的镜头,但它抱怨第一行中的 f 型太僵硬了。
scala - 在 Scala+Cats 中使用带有 Free Monads 的任意树
我正在为语法创建一个库,它将有 2 种不同的解释:1)基于语法解析字符串 2)以语法定义的语言生成字符串。
该库使用猫将语法的 AST 创建为自由单子。然而,它似乎不是完美的选择,因为自由单子创建了一个类似于列表的 AST 表示,这对于语句列表来说非常好,但是语法远离语句列表,更接近于任意树结构。
我设法通过使用~
运算符表示连接的 2 个语法来实现我的树。AST 是一个本身就是任意 AST 的语法列表。
我的问题是:在自由单子中递归 AST 子树的好方法是什么?
我当前的实现在这里:
特别注意,该Multi
案例使用不安全递归(即不是尾递归)来递归解释子树。有一个更好的方法吗?
haskell - 使用免费的 monad 进行日志记录
这个问题与这篇文章有关
这个想法是定义一个 DSL 来操作云中的文件,并定义一个解释器的组合来处理不同的方面,例如与 REST 接口的通信和日志记录。
为了使这一点更具体,假设我们有以下定义 DSL 术语的数据结构。
我们定义函数来构建 CloudFiles 程序如下:
然后这个想法是用另外两个 DSL 来解释这个:
我设法使用以下类型定义了从 CloudFiles DSL 到 REST DSL 的自然转换:
然后给出一个形式的程序:
可以使用 REST 调用来解释程序,如下所示:
当试图使用日志定义对 DSL 的解释时,问题就出现了。在我上面提到的文章中,作者定义了一个带有类型的解释器:
Free LogF a
我们定义了一个具有类型的解释器:
问题是这个解释器不能
foldFree
像我上面那样结合使用。所以问题是如何解释
Free CloudFilesF a
使用上面定义的函数logCloudfilesI
的程序interpretLog
?基本上,我正在寻找构造一个类型的函数:
我可以用 REST DSL 做到这一点,但我不能用 usng 做到这一点logCloudfilesI
。
在这些情况下使用免费 monad 时采取的方法是什么?请注意,问题似乎在于,对于日志记录情况,我们无法为函数 in 提供任何有意义的值ListFiles
来构建程序的延续。
然而,在作者使用的第二篇文章中,这在我当前的实现Halt
中不起作用。