问题标签 [purescript]

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 投票
1 回答
389 浏览

purescript - “未定义的值,不允许引用”解决方法

我正在寻找对编译器错误消息The value of xyz is undefined here, so reference is not allowed.以及 do-notation 的一些说明。我没有设法对这个例子进行足够的概括,我所能给出的只是我偶然发现这种行为的具体例子。对此感到抱歉。

使用purescript-parsing,我想编写一个接受嵌套多行注释的解析器。为简化示例,每个注释都以 开头(,以 结尾,)并且可以包含一个a或另一个注释。一些例子:(a)((a))接受()(a或被foo拒绝。

以下代码导致The value of comment is undefined here, so reference is not allowed.该行出现错误content <- string "a" <|> comment

我可以通过在上面插入一行来消除错误,content <- string "a" <|> comment据我所知,它根本不会改变生成的解析器:

问题是:

  • 这里发生了什么?为什么额外的线路有帮助?
  • 什么是让代码编译的非 hacky 方法?
0 投票
2 回答
336 浏览

purescript - 代替异构(但共享类)列表的适当抽象?

问题

我正在尝试用 PureScript 编写游戏引擎。我是新手,但是自从我之前经历过 Real World Haskell 以来,学习一直很顺利(尽管我也没有太多将 Haskell 用于“真实”事物的经验)。任何将我的运行时错误尽可能多地转化为编译时错误的事情,在我的书中都是一个胜利——但如果该语言被证明过于限制我抽象问题的能力,它可以消除一些胜利。

好的,所以,我正在尝试在 HTML5 Canvas/context2d 上用 PureScript 构建一个 2d 游戏引擎(显然 purescript-canvas 是一个很好的选择 - 我更喜欢它而不是 Elm 的 Graphics.Canvas 模块,因为它映射了很多更接近实际的底层 JS API,特别是让我可以访问 Canvas 的各个像素)。

在我现有的(未完成但可用的)JS 引擎中,核心功能是我将保留一个“精灵”列表(异构,除了它们都共享一个公共类),并遍历它们以调用.update(timeDelta).draw(context2d)方法。

这些精灵都共享一个通用接口,但必须在底层支持根本不同的数据。一个可能有 x/y 坐标;另一个(可能代表环境效果)可能具有“完成百分比”或其他动画状态。

问题是,我只是想不出一个等效的抽象(异构/共享类列表)来做我需要它做的事情,而不滥用 FFI 来破解我的方式进入非常不纯的代码。

解决方案(及其问题)

异构列表 (duh)

显然,可以做异构列表等效的最佳可能抽象是异构列表。

哈斯克尔风格

事实证明,Haskell(即欺骗的 GHC,而不是官方规范/报告)提供了我想要- 你可以在仍然保持类约束的同时将类型信息装箱,在列表中的所有项目上应用单个多态函数,不破坏类型安全。这将是理想的,但可惜 PureScript 目前不允许我表达如下类型:

PureScript-Style(最先进的)

对于 PureScript,有purescript-exists包,它可能旨在提供与上面的 Haskell 解决方案等效的功能,并让我(不是隐藏,而是删除)类型信息,然后将其重新放入。这会让我有一个异构列表,但会以完全破坏类型安全为代价。

更重要的是,我认为我不能让它令我满意,因为即使我有一个 的列表[Exists f],我也不能只是将类型提取/重新添加为泛型forall a. (Draw a) => a——我必须知道实际的我正在恢复的类型。我可以包含某种“标签”,告诉我应该提取哪种“真实”类型,但如果我要使用这些恶作剧,我还不如用纯 JS 编码。我可能必须做的(对于列表,不一定是包含的精灵)。

一个海量数据价值中的所有状态

我可以将所有精灵统一为具有相同类型,通过在一个庞大的结构中表示各个精灵的所有状态,将其传递给每个精灵的“更新”实现(仍然不能使用类多态性,但我可以包含一个突变作为类型的一部分的每个单独的精灵值的函数,并使用它)。这很糟糕,原因很明显:每个精灵都可以自由地改变/更新其他精灵的数据。对于我必须表示的每种新的精灵状态,必须在全局范围内更新海量数据结构。无法制作它的库,因为每个使用引擎的人都必须修改它。还不如是JS。

分离的同质状态类型

或者每个精灵可以有单独的状态,并且都具有相同的状态表示。这将避免“手指在彼此的馅饼中”的情况,但我仍然有一个统一的结构,我必须通过对每个精灵的需求的过多了解来更新,对于不需要的类型结构的那些位,大量浪费的数据由每个精灵。非常糟糕的抽象。

用 JSON 表示不同的数据或者你有什么

嗯。这种方式基本上只是使用 JS 数据并假装它是 PureScript。不得不抛弃 PureScript 打字的所有优势。

没有抽象

我可以将它们都视为完全不相关的类型。这意味着如果我想添加一个新的精灵,我必须更新最外层的draw函数来为最外层的函数添加一个drawThisParticularSprite, 同上update。可能是所有可能解决方案中最糟糕的一个。

我可能会做什么

假设我对可用的抽象选择的评估是正确的,很明显我将不得不以一种或另一种方式滥用 FFI 来做我需要的事情。也许我会有一个统一的记录类型,比如

哪里Data有一些杂乱无章的类型删除的东西,比如某种类型的东西Exists f,和

或者其他的东西。和方法都特定于单个记录,并且都“知道”要从中提取的真实draw类型。updateData

与此同时,我可能会继续询问 PureScript 开发人员是否有可能支持 Haskell 风格的存在主义东西,这样我就可以在不破坏类型安全的情况下获得一个正确的、真正的异构列表。我认为主要的一点是(对于之前链接的 Haskell 示例),ShowBox必须存储其(隐藏)成员的实例信息,因此它会Show从自己的show函数覆盖中知道要使用的正确实例.

恳求

有人可以确认以上关于我目前在 PureScript 中的可用选项是否准确?我会很感激任何更正,特别是如果你发现了一种更好的方法来处理这个问题——特别是如果有一种方法允许我只使用“纯”代码而不牺牲抽象——请告诉我!

0 投票
1 回答
144 浏览

javascript - 使用 PureScript 和 Pulp 从服务器下载二进制文件的正确方法

我有一个简单的 javascript 函数,它创建一个 XMLHttpRequest ,运行它(同步以使事情尽可能简单)并返回一个作为结果的数组。

我在 js 文件 x.js 中有该脚本,并且我有一个匹配的 PureScript 文件 x.purs,其中:

一切都很好,但是我正在使用 XMLHttpRequest 这是一个浏览器对象,并且在尝试运行纸浆运行时,我收到一个错误,即 XMLHttpRequest 未定义。

我尝试安装一个名为 xmlhttprequest 的 npm 包,其中包含所述对象,也尝试了类似的 bower 包,但都失败了。

我对javascript比较陌生,我认为我试图弄错的方式是完全错误的。解决这个问题的正确方法是什么?

我想我可以通过将脚本放在 .html 文件中来解决这个问题,但我想正确地做到这一点,即拥有匹配的 .purs 和 .js 文件,并让纸浆完成它的工作。

我该怎么做呢?

谢谢!

0 投票
1 回答
84 浏览

types - 为什么这个类型的类实例无法统一?

我正在尝试在 PureScript 中编写类似 Redux 的存储。

我为每个动作定义Action了类型类和代数数据类型,以划分为更小的模块。

并定义了一些状态类型和更新函数。更新函数可以接收所有类型的动作。

但是此代码会产生 TypesDoNotUnify 错误。

为什么会出现这个错误?我应该如何实现这样的更新功能?

0 投票
1 回答
114 浏览

purescript - 为半群定义“整数乘法”

给定一个半群,我想定义一个“整数乘法”,将“做某事 n 次”的概念形式化:

intMul n s == s <> s <> ... <> s对于任何和s,右侧出现 n 次。Int nSemigroup s

这似乎是一个相当通用的概念,所以我想已经有一个代数/群理论结构。如果存在,这个结构的名称是什么,它是由标准的纯脚本库之一提供的吗?

如果我需要自己写这个:每个半组的实现都是相同的。这是否意味着类型类不是代表它的正确选择?

编辑:要明智地将“intmultiplying”定义为零,我认为我需要一个幺半群而不是半群,所以intMul 0 s == mempty. 如果我想允许乘以负整数,我实际上需要逆元素,即一个组。哪个似乎在纯脚本中没有类型类,对吗?

0 投票
2 回答
94 浏览

purescript - 我可以使用一些 `map` 或 `apply` 来压缩这个表达式吗?

我有这段代码,我想压缩

我会设想类似的东西

在这种情况下,runFn someFn将创建一个部分应用的函数,等待其丢失的参数,然后将其一一应用于数组的元素。

我必须承认我不知道类型系统是否允许这样做。

编辑 按照要求 - 这里是实际的类型签名。但是我的问题是一个更普遍的问题:

如果这些参数的类型相同并且按数组元素部分应用函数数组元素,我可以将函数的参数放入数组中吗?

0 投票
2 回答
129 浏览

javascript - How to set a property of a typed object while retaining it's type?

I have a specific case, but I'm also curious in general.

I have a canvas, I get it's ImgData using createImageData, and I set it's data property to be something else, in order to then use PutImageData and pass it this modified ImgData.

My PureScript version fails, although writing the logic in Javascript in the console works flawlessly. The error is:

In PureScript:

Writing this javascript in console works (arr is 160*144*4 zeroes)

I've debugged getCleanBuffer and here's what I found

This $9 (ImgData copy with modified data) variable, when inspected, is revealed not to be of type ImgData, like v (the original ImgData) was, but it's just an 'Object'. It's missing the width and height which v had, but even when I fix it during debug I still get the same error.

I think the problem is that the new object is a typeless record. The fact that the width and height were not copied is another problem.

I can write a javascript function to set the data attribute manually. But this case in general, seems like a common one, surely I'm missing something, am I not?

Thanks!

0 投票
2 回答
338 浏览

typeclass - 实例头中具有行类型的类型类实例?

当我在玩 PureScript 时,我发现我想编写一个类型类Sync来等待任意异步值在Affmonad 中解析。我写的类型类是这样的:

现在我想Sync为 websocket 连接创建实例,它会等到连接打开并且可用于读/写。我写的实例是这样的:

但是,我收到以下类型错误:

来自 Haskell,这对我来说很有意义——它反映了我需要启用FlexibleInstances扩展的情况,PureScript 似乎也不支持——但我想知道我是否可以实现我想要的泛型。

我想也许我可以调整我的Sync课程,然后创建一个新类型。

不幸的是,现在我又被困住了,因为我不知道有什么方法可以给出与我一开始遇到的类似原因WebSocketAff的实例。MonadAff

有什么技巧可以让我在不完全违背泛型目的的情况下让它工作吗?或者这种东西目前在 PureScript 中还不能真正表达?

0 投票
2 回答
625 浏览

purescript - Purescript 铝热剂和 websockets

我正在尝试使用 purescript-thermite 来构建使用 websockets 的应用程序。这个想法是应用程序使用 websockets 连接到一些服务器并实时更新 HTML 页面。但是,我找不到将其连接到铝热剂工作流程的方法。

我有一个spec由 和 组成renderperformActionrender有权访问该功能dispatch。但是,我需要在渲染元素之前启动 websockets(我可能会将它放入,例如main),但是在消息到达时,我需要理想地dispatch从外部向组件发送一个事件。最好的方法是什么?

0 投票
1 回答
691 浏览

exception-handling - 如何从具有异常效果的 PureScript 函数返回值?

我刚刚开始学习 PureScript 效果,我一直在尝试制作一个具有异常效果的函数。

当我尝试运行它时,我收到以下错误

无法匹配类型

我知道 lengthGt5 在非异常情况下需要返回一个包裹在 Eff 中的 String ,但我不确定如何在 value 周围创建一个“空效果包装器” a。我在想这个吗?