问题标签 [effect-systems]

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 回答
4252 浏览

types - What is a type and effect system?

The Wikipedia article on Effect system is currently just a short stub and I've been wondering for a while as to what is an effect system.

  • Are there any languages that have an effect system in addition to a type system?
  • What would a possible (hypothetical) notation in a mainstream language, that you're familiar, with look like with effects?
0 投票
3 回答
337 浏览

monads - 纯函数式编程语言中的副作用方法

目前,我知道将副作用集成到纯函数式编程语言中的以下方法:

  • 效果系统
  • 继续
  • 独特的类型
  • 单子

单子经常被认为是最有效和最通用的方法。

还存在哪些其他方法?他们如何比较?

0 投票
1 回答
309 浏览

haskell - 当 Exc 是成员时 Control.Eff 的 MonadPlus 实例

单子变换器中,我们有

可扩展效果中,没有这样的东西

我试过实现它,但徒劳无功。这是我到目前为止所拥有的:

有2个问题:

  • 对于mzero,GHC 抱怨如下:

    为什么 GHC 不e0匹配e

    答案(在评论中提供):开启ScopedTypeVariables

  • for mplus,undefined应该换成 的反函数runExc,但是在extensible-effects的API中找不到。我错过了什么 ?

理由:我希望能够在a <|> b范围内写作Member (Exc e) r => Eff r a,意思是:

  • 尝试a
  • 如果a抛出ea,尝试b
  • 如果b抛出eb,则抛出mappend ea eb

这需要一个Alternative实例,这就是为什么我MonadPlus首先尝试实现一个实例。

注意:我使用的是 GHC 7.8.3 。

预先感谢您的帮助。

0 投票
1 回答
776 浏览

haskell - 如何在 haskell 中编写“更自由”的效果?

我正在尝试将一个简单的解释器从基于转换器的 monad 堆栈重写为基于 freer 的效果,但是我遇到了将我的意图传达给 GHC 类型系统的困难。

我目前只使用StateandFresh效果。我正在使用两种状态,我的效果跑步者看起来像这样:

最重要的是,我定义了一个具有这种类型的函数 FindMacro:

到目前为止,所有这些都运行良好。当我尝试编写时,问题就来了macroexpand2(好吧,macroexpand1,但我正在简化它,所以这个问题更容易理解):

这会产生以下错误:

好的,我可以Members为类型添加注释:

现在我明白了:

我被建议在 irc 上尝试forall r v w.,这没有任何区别。出于好奇,我IncoherentInstances在编译这段代码时尝试使用(我不想检查一个更自由的分支并玩),看看它是否会给我一个关于发生了什么的线索。它没有:

所以,这就是我对 freer 内部结构的理解用尽的地方,我有疑问:

  1. 为什么会有重叠实例?我不明白这是从哪里来的。
  2. IncoherentInstances实际上做了什么?自动选择听起来很可能会导致难以调试的错误。
  3. 我如何在另一个函数中实际使用 findMacro?

干杯!

0 投票
1 回答
66 浏览

haskell - 根据另一个具有更自由可扩展效果的效果编码效果

我一直在玩“freer monads”和可扩展效果,在freer-effects包中实现,我遇到了一个似乎可行但我无法解决的问题。

我编写了一个表示与文件系统的简单交互的类型:

为此编写解释器IO很容易,但很无聊。我真正感兴趣的是编写一个State内部使用的纯解释器。我可以有效地将 的实现内联runState到我的解释器中FileSystem,但这似乎有点违背了目的。我真正想做的是编写这两种类型之间的转换,然后重用State解释器。

编写这样的转换很简单:

现在我想要一个可以接受我的转换并通过重用解释器来解释我的通用reencode函数。有了这样的功能,我就可以编写以下解释器:fsAsStateFileSystemState

棘手的事情实际上是实施reencode。我得到了几乎可以进行类型检查的东西:

不幸的是,我不知道如何Eloop. 我认为我不了解优化FTCQueue类型如何工作的实现细节,以便了解我是否需要在这里做一些简单的事情,或者我正在做的事情是不可能的。

这可能吗?如果答案是否定的,并且事实证明我正在做事情实际上是不可能的,那么我会对帮助我理解原因的解释感兴趣。

0 投票
2 回答
144 浏览

haskell - 在多义词中使用 pooledMapConcurrentlyN

我目前正在玩 Polysemy,重写我的一个小玩具项目以适应它。我偶然发现了一段使用 的代码pooledMapConcurrentlyN,因此基本上是具有有限并发的并行版本。

我可以将我的示例简化为:

这不会编译,因为没有MonadUnliftIO (Sem r). 它在我使用时会编译traverse,但我正在寻找一个并发版本。我不确定我现在应该走哪条路。

我看到以下选项:

  • 实现一个MonadUnliftIO (Sem r)实例。我看到在这个 GitHub issue中有一些关于添加/实现这样一个实例的讨论。但是,我不清楚这样做是否是个好主意。
  • 使用除此之外的东西pooledMapConcurrentlyN会给我一个等效的行为。我知道有parTraverse来自par-dual包,但这需要一个ParDual实例。该parallel软件包也可以使解决方案成为可能,但是我对此并不熟悉,因此无法确定是否可行。
  • 将平行遍历建模为效果。我试过了,但我无法实现效果。我试过的效果定义是这样的:

我对 GADT 和 Polysemy 都不是很熟悉,所以我可能在这里遗漏了一些明显的东西。


编辑:正如下面的答案所指出的,最合适的解决方案是将其建模为效果并在效果解释中处理并发,而不是在业务逻辑中处理。这意味着我正在寻找类似于上述ParTraverse效果的更高阶效果(?):

我不确定这种类型签名是否正确(动作应该有 typea -> Sem r b吗?for 的签名traverse有一个Applicative约束m,我将如何建模?)

0 投票
0 回答
78 浏览

haskell - 将 `Sem (x ': r) a` 解释为 `Sem (y ': r) b`?

我正在尝试将机器组合在一起,以使用代数效应编写诸如秘密共享(例如)之类的东西。更具体地说,我希望能够根据每一方的行动来编写协议,然后将那个效果空间处理成模拟一些相互交谈的演员。

我想使用代数效应是因为我觉得它很酷,而且我认为它对后续的一些分析会有帮助。Polysemy似乎是一个不错的库选择。

例如,考虑三方试图获取其秘密输入总和的简单情况。我们可能会写类似

(上面是否有任何好处都很好知道,但不是这里的问题。一旦你让 Stack 编译 polysemy-zoo,它就会进行类型检查。

我将如何为效果编写处理程序Communication3

如果我们想象我们正在尝试将其实现为互联网协议,那么“可执行文件”看起来很像我们编写的代码;消息将被处理到通过网络发送和接收数据的任何过程中。
我也(事实上,主要是)希望能够在本地模拟三方。这意味着,粗略地说,我需要编写一个处理程序/解释器/运行器,例如

表示并行运行整个事情三次(大部分)。

显然这是可以做到的;处理State程序会这样做。但我还没有找到任何关于如何的文档。我应该在哪里寻找?我错过了什么?