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

haskell - 解析为自由单子

假设我有以下免费单子:

我知道如何使用这个 monad,例如。我可以写一些好帮手:

所以我可以在 haskell 中编写程序,例如:

我知道如何打印它、解释它等等。但是解析它呢?

是否有可能编写一个可以解析任意程序的解析器,例如:

所以我可以存储它们、序列化它们、在 cli 程序中使用它们等。

我一直遇到的问题是程序的类型取决于正在解析的程序。如果程序以 afoo它的类型Example ()结束,如果它以 abar它的类型结束Example Int

我不想为每个可能的排列编写解析器(这里很简单,因为只有两种可能性,但想象一下我们添加 Baz Int (String -> a), Doo (Int -> a), Moz Int a, Foz String a, .... 这很乏味且容易出错)。

也许我正在解决错误的问题?

样板

要运行上述示例,您需要将其添加到文件的开头:

注意:我提出了一个包含此代码的要点

0 投票
2 回答
149 浏览

haskell - 在最不固定类型之后的haskell中的双函子

我不确定如何在定点后推导出函子实例:

如果我修改 Mu 以接受额外的类型参数,我可以继续直到...:

在这里我需要undefined :: Mu (FreeF f a) a -> Mu (FreeF f b) bmu f它是相同的函子,在f这里它的类型不同。

解决这个问题的正确方法是什么?

0 投票
0 回答
435 浏览

haskell - 箭头、自由单子和 IO

Gabriel Gonzalez 在他的博客文章中描述了一种使用免费 monad 净化代码的方法。假设我们有FreeMonadIO a,那么我们可以编写不同的解释器,例如,一种用于测试目的,一种用于实际 IO。

我想知道是否可以为Arrows. 之类的东西FreeArrowIO a b,这将是具有副作用和显式输入的计算的纯粹表示,然后可以以不同的方式解释(其中之一是 IO)。

我知道我可以写类似的东西FreeArrowIO = Kleisli FreeMonadIO,但是有没有办法跳过 monad 步骤并直接定义 FreeArrowIO?

0 投票
2 回答
536 浏览

haskell - 如何将 MonadLogger 添加到我的免费 monad 转换器堆栈?

我已经在这里问过这个问题,但我想我也会尝试。

如何添加MonadLogger到这个免费的单子变压器堆栈?

我可以MonadThrow毫无问题地添加;我希望添加MonadLogger会同样容易。

我尝试添加它并收到此错误:

如果我定义一个实例:

我收到此错误:

是我正在编译的基本示例的链接。

0 投票
1 回答
183 浏览

scala - 在 scalaz 中免费实现

Haskell 中的 Free 实现是:

而Scalaz中的实现是:

为什么 scalaz 实现不类似于 Haskell,例如:

这两个实现是同构的吗?

0 投票
1 回答
873 浏览

scala - 如何将 free monad 与 Future[M[_]] 一起使用

我已经使用免费的 monad 为 ETL 过程实现了一种简单的语言。当List用作数据获取和存储的输入和输出时,一切正常。但是我正在使用异步库并使用Future[List]

常见的导入和定义

List

不合作Future[List]

正如预期的那样,从flatMap/返回的类型map是错误的 - 我没有得到OpsF[Future]Future[OpsF]

我目前的解决方法是store接受Future[List[Record]]并让解释器映射到Future,但感觉很笨拙。

该问题并非特定于List-例如Option也很有用。

我做错了吗?有某种单子变压器吗?

0 投票
2 回答
154 浏览

haskell - 在 Haskell 中,我如何将一个 Free monad 嵌入到另一个中?

我有两个 Free monads 用于不同上下文中的不同操作。但是,如果特定操作在上下文中,则一个 ( major) DSL 需要包含另一个 ( ):action

问题是,GHC 会抱怨inMajorFunctor是一种,而不仅仅是一种类型。这是因为在定义中它应该接受 a作为类型参数,而在该行中它不包含这样的参数。但是即使消息对我来说很清楚,我也不确定是否应该在仿函数中声明这样的额外类型参数:ActionAct Action next(* -> *)data ActionFunctornextAct ActionMajor

这看起来很奇怪,因为只有一个数据构造函数会使用该参数,而这样的暴露会变成每一个MajorFunctorMajorFunctor actionNext看起来完全暴露了太多细节。所以我看了一下FreeTtransformer,看看它是否是我想要的。但是,在我的情况下,我只需要Action在 DSL 程序有这样的操作时调用解释器,而不是bind单子程序中的每一个,所以我也不确定转换器是否是一个好的解决方案。

0 投票
1 回答
135 浏览

haskell - Haskell:在 FreeMonad 解释器中使用 MonadState 进行记忆

鉴于我有以下 DSL(使用 Free Monad)及其解释器:

我想在内部更改解释器以使用 MonadState ,以便如果 aThing已经为给定检索到Id,则没有第二次调用SomeApi

假设我已经知道如何使用getand编写记忆版本put,但我遇到的问题是在MonadState内部运行runMyDsl。我在想解决方案看起来类似于:

但是类型不对齐,因为run返回(.. , MonadState ThingMap m) => m aevalStateT期望StateT ThingMap m a

0 投票
1 回答
118 浏览

haskell - 如何将 IO monad 中的值分配给 RankNType 合格的构造函数

(更新)

我已经使用Free Monad为通用数据存储创建了一个接口。我想将用户在运行时选择的特定解释器(:: DataStore a -> IO a)连同其他一些信息一起放入状态单子中。我似乎无法在数据结构中的该字段中添加任何内容。

如何将值放入定义为更高级别类型的字段中?

下面是一个最小的例子:

当我尝试这样做时,GHC 抱怨说:


更新

我最初的最小示例是最小的。一些进一步的实验表明,当我需要在 IO monad 中加载接口以便读取命令行选项时,就会出现问题。我已更新示例以包含该问题。知道了这一点,我也许可以围绕它进行编码。

有趣的 GHCI 告诉我类型函数的结果IO (DataStore a -> IO a)不是DataStore GHC.Prim.Any -> IO GHC.Prim.Any我所期望的。

0 投票
1 回答
207 浏览

haskell - 是否可以使用 Free 在 DSL 中实现多态函数