问题标签 [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.
haskell - GHC:无法推断幻像类型参数
所以我正在尝试为可变长度元组创建一个类型,基本上是作为Either a (Either (a,b) (Either (a,b,c) ...))
and的更漂亮的版本Either (Either (Either ... (x,y,z)) (y,z)) z
。
但是,编译器似乎无法推断prepend
或append
在递归情况下的幻像类型参数:
我能做些什么来帮助编译器做出这个推断吗?
c# - 在 EF Code First 4.3 中使用幻像键类型
是否可以使用带有 Code First 的幻像类型作为我的主键?
我有这样的事情:
ocaml - 擦除类型参数
我有一个模块 Socket 使用幻像类型来强制执行一些简单的访问控制:
我想将 Socket.t 包装在 Container.t 记录中,但是有没有办法不将幻像类型参数也传播到 Container.t 中?
haskell - 访问返回值的幻像类型
下面是一个模算数 Num 实例的实现,它以Data.Fixed
.
我想编写一个替代实现,fromRational
它看起来像:
但我不知道我会用什么theModulus
。与其他类型类函数不同,我没有Modular a
可以调用的类型值modulus
。
ocaml - OCaml 中的高阶类型(幻像类型子类型)
我正在使用幻像类型来模拟堆栈的状态,作为 ocaml-lua 的包装器模块(Lua 通过堆栈与 C/OCaml 通信)。小代码示例:
某些堆栈操作在表和数组表上都是可能的(Lua 中没有真正的数组);有些不是。所以如果我有类型
我想要一种类似 table-or-array 的函数,用于在这两种类型上运行的函数,但仍然能够rawgeti
在表上禁止例如(数组操作)。objlen
是一个堆栈操作,它返回堆栈顶部元素的“长度”。该元素可以是表或数组表。目前,包装函数定义如下:
我想要的是
也就是说,array
并且table
是 的子类型table-or-array
。
有任何想法吗?
问候 Olle
编辑
经过考虑,我想出了这个:
类型级别的堆栈现在应该知道的不比堆栈本身多或少。例如,rawgeti 将推送任何类型的堆栈。
haskell - 为什么这个 Haskell 表达式会编译?
这是我写的一些定义,以避免混合货币
usd 34 + usd 3
按预期进行类型检查usd 33 + eur 33
是预期的编译错误- 我很惊讶,但
usd 33 + 3
根据编译器可以。我想避免的东西,但不明白。我怀疑这是因为Num
实例,但是与第二种情况有什么区别?
你能解释一下为什么usd 33 + 3
编译以及是否可以让类型检查器拒绝这个表达式。
haskell - 幻像类型如何与 newtype 一起使用?
我对新类型的理解是它们是由 GHC 编译出来的。然而,这不可能是全部,因为幻像类型可以保存信息。
从这里:
您可以将 [a type] 包装在 newtype 中,它将被认为与类型检查器不同,但在运行时相同。然后,您可以使用各种深层技巧,例如幻像或递归类型,而不必担心 GHC 会无缘无故地对字节桶进行洗牌。
例如,想象一个表示算术模 q 的新类型:
addZq
不能编译成
那么 newtype 是在什么意义上编译出来的,幻像类型信息存储在哪里呢?
haskell - 从幻像类型创建(获取)值实例
我正在使用 GADT 为货币创建一个基本维度(如物理维度)系统。维度(例如 USD、USD/EUR、EUR/USD)表示为虚拟类型。我希望能够使用 Show 以例如“10.3USD”或“0EUR”的样式打印货币金额以及例如“10.3USD/EUR”的汇率。我不太确定如何解释我的问题,所以我将举一个例子来说明我是如何解决它的:
使用此代码,我得到错误
我必须说我不明白为什么在这种情况下编译器在a1
我指定a
.
当然,我想避免在 haskell 类型系统之外表示维度,因为这为我添加了额外的样板代码,并且据我所知理论上是不必要的(即编译器应该有足够的信息来推断如何显示 Amount 或 a编译时的速率)(并在运行时增加一点开销)。
scala - Scala:使用类型参数或抽象类型作为类型边界
假设我有:
这编译:
这失败了:
...和:
我尝试使用抽象类型而不是类型参数,结果相同。我发现的唯一解决方法是实例化类型。这编译:
不幸的是,我正在使用没有运行时实例的幻像类型,通常是出于性能原因。
为什么 Scala 会在这里产生编译错误?有更好的解决方法吗?
谢谢你的帮助。
更新:除了下面的解决方法之外,我还需要一种方法来覆盖具有抽象类型边界的类型。我这样做是这样的:
haskell - 如何为返回幻像类型的幻像类型创建实例?
让我们有以下数据类型:
现在我们希望能够从 Foo1 或 Int 中获取 Foo3。一个解决方案可能是使用类型类:
在这里,编译器抱怨(正确!)它不能将 b 与 b1 匹配,因为类定义中 Foo3 的“b”与实例中的 Foo1 不同。
有没有办法解决这个问题?