问题标签 [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 - 解析为自由单子
假设我有以下免费单子:
我知道如何使用这个 monad,例如。我可以写一些好帮手:
所以我可以在 haskell 中编写程序,例如:
我知道如何打印它、解释它等等。但是解析它呢?
是否有可能编写一个可以解析任意程序的解析器,例如:
所以我可以存储它们、序列化它们、在 cli 程序中使用它们等。
我一直遇到的问题是程序的类型取决于正在解析的程序。如果程序以 afoo
它的类型Example ()
结束,如果它以 abar
它的类型结束Example Int
。
我不想为每个可能的排列编写解析器(这里很简单,因为只有两种可能性,但想象一下我们添加
Baz Int (String -> a)
, Doo (Int -> a)
, Moz Int a
, Foz String a
, .... 这很乏味且容易出错)。
也许我正在解决错误的问题?
样板
要运行上述示例,您需要将其添加到文件的开头:
注意:我提出了一个包含此代码的要点。
haskell - 在最不固定类型之后的haskell中的双函子
我不确定如何在定点后推导出函子实例:
如果我修改 Mu 以接受额外的类型参数,我可以继续直到...:
在这里我需要undefined :: Mu (FreeF f a) a -> Mu (FreeF f b) b
但mu f
它是相同的函子,在f
这里它的类型不同。
解决这个问题的正确方法是什么?
haskell - 箭头、自由单子和 IO
Gabriel Gonzalez 在他的博客文章中描述了一种使用免费 monad 净化代码的方法。假设我们有FreeMonadIO a
,那么我们可以编写不同的解释器,例如,一种用于测试目的,一种用于实际 IO。
我想知道是否可以为Arrows
. 之类的东西FreeArrowIO a b
,这将是具有副作用和显式输入的计算的纯粹表示,然后可以以不同的方式解释(其中之一是 IO)。
我知道我可以写类似的东西FreeArrowIO = Kleisli FreeMonadIO
,但是有没有办法跳过 monad 步骤并直接定义 FreeArrowIO?
scala - 在 scalaz 中免费实现
Haskell 中的 Free 实现是:
而Scalaz中的实现是:
为什么 scalaz 实现不类似于 Haskell,例如:
这两个实现是同构的吗?
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
也很有用。
我做错了吗?有某种单子变压器吗?
haskell - 在 Haskell 中,我如何将一个 Free monad 嵌入到另一个中?
我有两个 Free monads 用于不同上下文中的不同操作。但是,如果特定操作在上下文中,则一个 ( major
) DSL 需要包含另一个 ( ):action
问题是,GHC 会抱怨inMajorFunctor
是一种,而不仅仅是一种类型。这是因为在定义中它应该接受 a作为类型参数,而在该行中它不包含这样的参数。但是即使消息对我来说很清楚,我也不确定是否应该在仿函数中声明这样的额外类型参数:Action
Act Action next
(* -> *)
data ActionFunctor
next
Act Action
Major
这看起来很奇怪,因为只有一个数据构造函数会使用该参数,而这样的暴露会变成每一个MajorFunctor
,MajorFunctor actionNext
看起来完全暴露了太多细节。所以我看了一下FreeT
transformer,看看它是否是我想要的。但是,在我的情况下,我只需要Action
在 DSL 程序有这样的操作时调用解释器,而不是bind
单子程序中的每一个,所以我也不确定转换器是否是一个好的解决方案。
haskell - Haskell:在 FreeMonad 解释器中使用 MonadState 进行记忆
鉴于我有以下 DSL(使用 Free Monad)及其解释器:
我想在内部更改解释器以使用 MonadState ,以便如果 aThing
已经为给定检索到Id
,则没有第二次调用SomeApi
假设我已经知道如何使用get
and编写记忆版本put
,但我遇到的问题是在MonadState
内部运行runMyDsl
。我在想解决方案看起来类似于:
但是类型不对齐,因为run
返回(.. , MonadState ThingMap m) => m a
和evalStateT
期望StateT ThingMap m a
。
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
我所期望的。