问题标签 [phantom-types]

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

haskell - GHC:无法推断幻像类型参数

所以我正在尝试为可变长度元组创建一个类型,基本上是作为Either a (Either (a,b) (Either (a,b,c) ...))and的更漂亮的版本Either (Either (Either ... (x,y,z)) (y,z)) z

但是,编译器似乎无法推断prependappend在递归情况下的幻像类型参数:

我能做些什么来帮助编译器做出这个推断吗?

0 投票
1 回答
127 浏览

c# - 在 EF Code First 4.3 中使用幻像键类型

是否可以使用带有 Code First 的幻像类型作为我的主键?

我有这样的事情:

0 投票
1 回答
525 浏览

ocaml - 擦除类型参数

我有一个模块 Socket 使用幻像类型来强制执行一些简单的访问控制:

我想将 Socket.t 包装在 Container.t 记录中,但是有没有办法将幻像类型参数也传播到 Container.t 中?

0 投票
2 回答
238 浏览

haskell - 访问返回值的幻像类型

下面是一个模算数 Num 实例的实现,它以Data.Fixed.

我想编写一个替代实现,fromRational它看起来像:

但我不知道我会用什么theModulus。与其他类型类函数不同,我没有Modular a可以调用的类型值modulus

0 投票
1 回答
1247 浏览

ocaml - OCaml 中的高阶类型(幻像类型子类型)

我正在使用幻像类型来模拟堆栈的状态,作为 ocaml-lua 的包装器模块(Lua 通过堆栈与 C/OCaml 通信)。小代码示例:

某些堆栈操作在表和数组表上都是可能的(Lua 中没有真正的数组);有些不是。所以如果我有类型

我想要一种类似 table-or-array 的函数,用于在这两种类型上运行的函数,但仍然能够rawgeti在表上禁止例如(数组操作)。objlen是一个堆栈操作,它返回堆栈顶部元素的“长度”。该元素可以是表或数组表。目前,包装函数定义如下:

我想要的是

也就是说,array并且table是 的子类型table-or-array

有任何想法吗?

问候 Olle

编辑

经过考虑,我想出了这个:

类型级别的堆栈现在应该知道的不比堆栈本身多或少。例如,rawgeti 将推送任何类型的堆栈。

0 投票
2 回答
163 浏览

haskell - 为什么这个 Haskell 表达式会编译?

这是我写的一些定义,以避免混合货币

  • usd 34 + usd 3按预期进行类型检查
  • usd 33 + eur 33是预期的编译错误
  • 我很惊讶,但usd 33 + 3根据编译器可以。我想避免的东西,但不明白。我怀疑这是因为Num实例,但是与第二种情况有什么区别?

你能解释一下为什么usd 33 + 3编译以及是否可以让类型检查器拒绝这个表达式。

0 投票
2 回答
345 浏览

haskell - 幻像类型如何与 newtype 一起使用?

我对新类型的理解是它们是由 GHC 编译出来的。然而,这不可能是全部,因为幻像类型可以保存信息。

这里

您可以将 [a type] 包装在 newtype 中,它将被认为与类型检查器不同,但在运行时相同。然后,您可以使用各种深层技巧,例如幻像或递归类型,而不必担心 GHC 会无缘无故地对字节桶进行洗牌。

例如,想象一个表示算术模 q 的新类型:

addZq不能编译成

那么 newtype 是在什么意义上编译出来的,幻像类型信息存储在哪里呢?

0 投票
1 回答
98 浏览

haskell - 从幻像类型创建(获取)值实例

我正在使用 GADT 为货币创建一个基本维度(如物理维度)系统。维度(例如 USD、USD/EUR、EUR/USD)表示为虚拟类型。我希望能够使用 Show 以例如“10.3USD”或“0EUR”的样式打印货币金额以及例如“10.3USD/EUR”的汇率。我不太确定如何解释我的问题,所以我将举一个例子来说明我是如何解决它的:

使用此代码,我得到错误

我必须说我不明白为什么在这种情况下编译器在a1我指定a.

当然,我想避免在 haskell 类型系统之外表示维度,因为这为我添加了额外的样板代码,并且据我所知理论上是不必要的(即编译器应该有足够的信息来推断如何显示 Amount 或 a编译时的速率)(并在运行时增加一点开销)。

0 投票
1 回答
178 浏览

scala - Scala:使用类型参数或抽象类型作为类型边界

假设我有:

这编译:

这失败了:

...和:

我尝试使用抽象类型而不是类型参数,结果相同。我发现的唯一解决方法是实例化类型。这编译:

不幸的是,我正在使用没有运行时实例的幻像类型,通常是出于性能原因。

为什么 Scala 会在这里产生编译错误?有更好的解决方法吗?

谢谢你的帮助。

更新:除了下面的解决方法之外,我还需要一种方法来覆盖具有抽象类型边界的类型。我这样做是这样的:

0 投票
5 回答
657 浏览

haskell - 如何为返回幻像类型的幻像类型创建实例?

让我们有以下数据类型:

现在我们希望能够从 Foo1 或 Int 中获取 Foo3。一个解决方案可能是使用类型类:

在这里,编译器抱怨(正确!)它不能将 b 与 b1 匹配,因为类定义中 Foo3 的“b”与实例中的 Foo1 不同。

有没有办法解决这个问题?