Purescript 将类视为循环类型同义词

史诗橙

我正在尝试定义仅适用于类型级别自然数的实例。当我编译这个文件时:

module Main where

data NatZero
data NatSucc n

class NatClass n where
   switch :: f NatZero -> (forall m. NatClass m => f (NatSucc m)) -> f n

它告诉我:

Error found:
at src/Main.purs:6:1 - 7:73 (line 6, column 1 - line 7, column 73)

  A cycle appears in the definition of type synonym NatClass
  Cycles are disallowed because they can lead to loops in the type checker.
  Consider using a 'newtype' instead.

为什么 NatClass 成为类型同义词?我认为这是一个类型类。哪里有循环?我应该改变什么才能使这项工作像在 Haskell 中一样?它告诉我要 newtype,我要什么 newtype?

国标

错误消息具有误导性和不幸性 - 这不是你在这里的代码做错了什么,这是由于编译器如何对类进行脱糖而发生的。

目前字典表示为记录,所以这里错误中提到的同义词是因为编译器为类创建了这样的东西:

type NatClass n = 
  { switch :: forall f. f NatZero -> (forall m. NatClass m => f (NatSucc m)) -> f n }

这样它就可以用字典参数相当直接地替换约束。

我认为现在这个类(或任何将自身用作成员中的约束的类)都会有同样的问题。

一段时间以来,我一直想更改类型类的表示形式,并为此拥有一个WIP PR,我认为之后这种事情将被允许。此类之后将被脱糖为data类型而不是同义词,因此应该允许引用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

PureScript和类型类

来自分类Dev

PureScript“内部”量化类型

来自分类Dev

PureScript - 什么是新类型?

来自分类Dev

buildQueryString函数的Purescript类型

来自分类Dev

将PureScript类型暴露给JavaScript

来自分类Dev

Purescript类型不统一

来自分类Dev

Purescript:将 Maybe 类型转换为类型

来自分类Dev

Purescript 将 cons 定义为类型类运算符

来自分类Dev

一个类中的多个类型同义词

来自分类Dev

使用特定的类定义类型同义词

来自分类Dev

如何为类型类名称创建同义词?

来自分类Dev

PureScript - 如何添加或减去新类型

来自分类Dev

purescript列表/数组中的类似记录类型

来自分类Dev

Purescript简单JSON,结合记录类型

来自分类Dev

Purescript 导入中缀类型构造器

来自分类Dev

在 PureScript 中专门化类实例

来自分类Dev

purescript 卤素:将 IProp 附加到 HTML

来自分类Dev

PureScript无法将类型Maybe Int与类型Int匹配

来自分类Dev

PureScript - 无法将 Maybe String 类型与 String 类型匹配

来自分类Dev

是否存在Purescript类型类来泛化整数?

来自分类Dev

找出类型同义词的类型

来自分类Dev

类型同义词导致类型错误

来自分类Dev

如何在PureScript中合并记录类型的行?(PureScript 0.12.0中的Union type类是否可以替代?)

来自分类Dev

在haskell中查找类型同义词

来自分类Dev

让Haskell区分类型同义词

来自分类Dev

使用类型同义词定义实例

来自分类Dev

在 purescript 中获取新类型的记录基础类型

来自分类Dev

模式同义词无法统一类型级别列表中的类型

来自分类Dev

在PureScript中将#与两种类型一起使用