问题标签 [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 - Free Monads 中的抽象结果类型
假设我们想要定义一个简单的 DSL 来定义 UI 交互,我们可以在其中创建对象然后选择它们:
我遇到的问题是我不想指定创建命令的返回类型应该是什么(E
上面)。我想把这个决定交给口译员。例如,E
可以是一个字符串,或者Future
如果我们正在使用异步 REST 调用创建对象。
如果我尝试以通常的方式定义 DSL,liftF
如下所示:
我收到以下错误:
我无法理解上面的代码出了什么问题,但更重要的问题是这是否是对出现在自由单子中的类型进行抽象的正确方法。如果不是,那么正确的(功能性)方法是什么?
编辑:
在 Haskell 中,上述方法没有问题:
运行测试将产生以下输出:
scala - 用于系统测试 DSL 的实用免费单子:并发和错误处理
我正在尝试编写用于在 Scala 中编写系统测试的 DSL。在这个 DSL 中,我不想暴露某些操作可能异步发生(例如,因为它们是使用正在测试的 Web 服务实现的),或者可能发生错误(因为 Web 服务可能不可用)的事实,并且我们希望测试失败)。在这个答案中,不鼓励这种方法,但在用于编写测试的 DSL 上下文中,我并不完全同意这一点。我认为 DSL 会因为这些方面的引入而受到不必要的污染。
为了解决这个问题,请考虑以下 DSL:
现在假设我们要实现一个解释器,它利用我们的测试服务来放置和计算商店中的元素。由于我们使用网络,我希望put
操作异步进行。此外,鉴于可能发生网络错误或服务器错误,我希望程序在发生错误时立即停止。为了说明我想要实现的目标,这里是一个通过 monad 转换器混合 Haskell 中不同方面的示例(我无法转换为 Scala)。
M
所以我的问题是,你会为满足上述要求的解释器使用哪个 monad :
如果 M 是一个 monad 转换器,您将如何使用您选择的 FP 库(Cats、Scalaz)来组合它们。
scala - 如何在 fs2 中使用 Free 和 Steam?
假设我想从 jms 读取数据,将其映射toUpperCase
并发送到其他地方。所以我用 抽象出实际的消息系统Jms[A]
,对吧?
业务逻辑:
Free
是要被解释的,就这样吧:
但是,要传递给freeProcess
? 这些/是什么?实现不是在完成所有工作吗?那我就不能忘记s吗?source
sink
interpreter
Stream
怎么在这里实际使用Free
?
haskell - 自由对象是如何构造的?
所以我知道一个自由对象被定义为一个附属物的左侧。但这如何引导您了解此类对象的 Haskell 定义?
更具体地说:给定一个从单子类别到内函子类别的“健忘函子”,
那么free monad Free :: (* -> *) -> (* -> *)
是一个接受(一个Monad
实例和)以下同构的类型:
如果我们去掉Forget
s,对于Control.Monad.Free
我们拥有的自由单子fwd = foldFree
和bwd = (. liftF)
(我认为?)
但是这些法律是如何导致发现的Control.Monad.Free
呢?你怎么想出来的data Free f a = Return a | Free (f (Free f a))
?在你想出符合法律的东西之前,你肯定不会只是猜测吗?同样的问题也适用于图的自由类别、集合的自由幺半群以及您想命名的任何其他自由对象。
scala - 为什么使用免费的 monad 解释器编译这段代码?
我试图理解免费的单子。因此,在教程的帮助下,我编写了玩具示例来玩,现在我不明白为什么它会编译。这里是:
我说的是解释器的应用方法。它应该返回 Option[A],但我可以在这里返回 Option[Unit] 和 Option[String],所以我认为它应该是编译错误。但事实并非如此。这段代码可以编译并且可以工作(尽管 Idea 告诉我这是一个错误)。这是为什么?
UPD:但是为什么不编译呢?
haskell - 将索引函子注入函子协积
我正在尝试使用索引的免费单子(Oleg Kiselyov 有一个 intro)。我还希望这个免费的 monad 是从 functors 的 coproduct 中构建的,a la Data Types a la carte。但是,我无法让副产品注入类型类工作。这是我到目前为止所拥有的:
所以尝试 1 破坏了类型推断。尝试 2 对用户的人体工程学设计不佳。尝试 3 似乎是正确的方法,但我不太清楚如何使关联的类型实例发挥作用。这种注射应该是什么样子?
scala - Scala:如何将操作列表组合成一个免费的 monad?
我有一个免费的 monad 可以满足我的要求:
我可以这样称呼它来创建一个程序:
凉爽的!但问题是:
我有一个List[Operation]
我想翻译成这种单子结构的东西……我该怎么做?
List
将我的 of翻译Operations
成我可以通过我的解释器的自由单子的正确方法是什么?
scala - 堆叠免费单子
我正在学习 Free monad,并且我在 Scala 中整理了一个简单的示例,在其中我使用它们来定义两种特定于域的语言。
第一个 monad 处理存储库的副作用。我已经实现了一个解释器,它使用 state monad 来管理状态,但在实际程序中我会使用数据库。
第二个单子处理 IO。
然后,我可以把这两个“程序”放在一起
并运行他们做
我知道这远非理想,我想编写一个程序和一个支持的解释器:
所以问题是:
- 如何将两个单子堆叠在一起成为“完整程序”
- 如何将两个解释器组合成一个新的解释器?
- 如何处理返回的 Option[Todo]
find
,然后传递给represent
scala - 免费 ~> Trampoline : 递归程序因 OutOfMemoryError 而崩溃
假设我试图用一个操作实现一种非常简单的领域特定语言:
然后我想写一个程序,它以一个整数n
作为输入,打印一些如果n
可以被 10k 整除的东西,然后用 , 调用自身n + 1
,直到n
达到某个最大值N
。
省略所有由 for-comprehensions 引起的句法噪音,我想要的是:
从本质上讲,这将是一种“嘶嘶声”。
以下是使用 Scalaz 7.3.0-M7 中的 Free monad 来实现此功能的一些尝试:
不幸的是,直接翻译 ( p0
) 似乎以某种 O(N^2) 开销运行,并因 OutOfMemoryError 而崩溃。问题似乎是for
-comprehensionmap{x => ()}
在递归调用之后附加了 a p0
,这迫使Free
monad 用“完成'p0'然后什么都不做”的提醒来填充整个内存。如果我手动“展开”for
理解,并明确写出最后一个flatMap
(如p3
and p4
),那么问题就会消失,一切都会顺利进行。然而,这是一个非常脆弱的解决方法:如果我们简单地附加 a map(id)
,程序的行为会发生巨大变化,而这map(id)
在代码中甚至是不可见的,for
-理解。
在此较早的帖子中:https ://apocalisp.wordpress.com/2011/10/26/tail-call-elimination-in-scala-monads/
反复建议将递归调用包装到suspend
. 这是Applicative
实例和的尝试suspend
:
插入suspend
并没有真正帮助:它仍然很慢,并且与OutOfMemoryError
s.
我应该suspend
以不同的方式使用吗?
也许有一些纯粹的句法补救措施可以在不生成map
最终的情况下使用 for-comprehensions?
如果有人能指出我在这里做错了什么以及如何修复它,我将非常感激。
haskell - Free 和 Cofree 的不动点函子
为了清楚起见,我不是在谈论free monad 看起来很像应用于 functorFree f
的定点组合器,即基本上是f
. (并不是说这不有趣!)
我所说的是 的定点,即与自身同构的Free, Cofree :: (*->*) -> (*->*)
函子。f
Free f
f
背景:今天,为了巩固我对自由 monad 相当缺乏的理解,我决定只为不同的简单函子写一些它们,forFree
和forCofree
,看看它们会同构到哪些更知名的 [co] monad . 令我特别感兴趣的是与(意思是,将任何类型映射到无人居住的函子)同构的发现。Cofree Empty
Empty
Const Void
好吧,也许这只是愚蠢的——我发现如果你把空垃圾放进去,你就会把空垃圾拿出来,是的!——但是,嘿,这是范畴论,整个宇宙从看似微不足道的事物中升起……对吧?
直接的问题是,如果Cofree
有这样一个固定点,那么Free
呢?好吧,它当然不可能Empty
,因为那不是单子。快速嫌疑人将是附近的东西,例如Const ()
or Identity
,但不是:
事实上,Free
总是添加一个额外的构造函数的事实表明,任何作为不动点的函子的结构都必须已经是无限的。但奇怪的是,如果Cofree
有这样一个简单的固定点,Free
应该只有一个更复杂的固定点(就像FixFree a = C (Free FixFree a)
Reid Barton 在评论中提出的修复)。
无聊的事实只是Free
没有“偶然的固定点”,只是巧合而已Cofree
,还是我错过了什么?