- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有人能给我指出一组在 Haskell 中为 GADT 定义 Typeable 或 Typeable1 实例的好示例吗?
或者,有人可以向我展示如何为以下 GADT 定义 Typeable(手动)。
data V a where
Unit :: V ()
Pair :: V a -> V b -> V (a, b)
L :: V a -> V (Either a b)
R :: V b -> V (Either a b)
Fresh :: Int -> V a
或者指向介绍该想法的论文的指针也会有所帮助。
最佳答案
看起来该网站现在已经消失了,但是回溯机仍然有链接到所有原始论文的网站:http://web.archive.org/web/20080622204226/http://www.cs.vu.nl/boilerplate/
无论如何,Typeable 几乎完全是机械的。即使对于 GADT,您也可以通过 DeriveDataTypeable 扩展来派生它。至少当类型为 * -> *
时,如您的示例所示。
我还可以给出手动提供 Typeable1 实例的示例,但它将在下一版本的 GHC 中弃用。用于手动创建实例的接口(interface)正在更改。
{-# NOINLINE vTyCon #-}
vTyCon :: TyCon
vTyCon = mkTyCon "ModuleName.V"
instance Typeable1 V where
typeOf1 _ = mkTyConApp vTyCon []
NOINLINE
编译指示实际上很重要,因为 mkTyCon 在幕后做了不安全的事情。这就是为什么最好让 GHC 手动派生实例(如果可能的话)。
我的理解是,GHC future 版本中将要更改的部分是您应该使用不同的函数 mkTyCon3
,它将包名称、模块名称和类型名称作为单独的参数。这是一个明显的改进,即使使支持多个版本的 GHC 变得更加困难。请参阅:Changes to Data.Typeable .
来自 GHC 文档:
Also since GHC 7.8.1, handwritten (ie. not derived) instances of Typeable are forbidden, and will result in an error.
您永远不需要甚至被允许使用任何现代版本的 GHC 手动编写 Typeable
实例。事实上,您甚至不需要告诉 GHC 来导出它们 - 它会自动执行此操作。
关于haskell - 为 GADT 定义您自己的 Typeable 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6833398/
假设我有以下代码: {-# LANGUAGE GADTs, DeriveDataTypeable, StandaloneDeriving #-} import Data.Typeable class
我正在尝试为关联的数据系列派生Typeable,如下所示: {-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE TypeFamilies #-} modu
如何为 Typeable 编写实际的实例声明?例如,假设我想为 Char 编写一个实例,其中每个字符都有不同的类型,例如 instance Typeable Char where typeOf
[...] wants to find all the places in a legacy codebase that a variable foo is used in the condition
我大致想要实现以下目标: f :: a -> a g :: b -> b h :: Typeable t => t -> Maybe t h x = case x of (x is of type
例如,假设我们有以下数据结构: data Foo = Bool Bool | Int Int | Double Double 现在,有没有更简单的方法来做到这一点: foo :: Typeable a
所以这是我的对象系统传奇的延续(part 1,part 2)。 这部分基本上归结为以下内容。 {-# LANGUAGE ExistentialQuantification #-} {-# LANGUA
通用编程时间! 如果我有一个函数: f :: a1 -> a2 -> a3 -> ... -> an 和一个值 v :: aX -- where 1 a2 -> a3 -> a4 -> a5)
自 GHC 7.8 起,Typeable 是多类的。查看内置 Typeable 实例列表 in the documentation ,我注意到一些有趣的事情: Typeable ((* -> *) -
我遇到过对 Haskell 的 Data.Typeable 的引用,但我不清楚为什么要在代码中使用它。 它解决了什么问题以及如何解决? 最佳答案 Data.Typeable 是一种众所周知的方法(参见
我正在玩 Haskell 的 Data和 Typeable ,并且我一直试图在上下文中没有可用类型变量的情况下获取函数的参数。 让我澄清一下我的意思。只要我像下面这样对类型变量 a 进行量化,我就可以
有人能给我指出一组在 Haskell 中为 GADT 定义 Typeable 或 Typeable1 实例的好示例吗? 或者,有人可以向我展示如何为以下 GADT 定义 Typeable(手动)。 d
我有一些这样的类型: data Currency = USD | EUR deriving (Show, Typeable) data Money :: Currency
我正在尝试为 (':) 派生一个 Typeable 实例 我正在使用 DataKinds 和 [*]。 我启用了 TypeOperators、StandaloneDeriving 和 PolyKind
我有 data D t = ... data SomeStuff = forall a (Typeable a, ...) => SomeStuff a 在某些时候,我得到了一个 SomeStuff,
我试图使用 Shapeless Typeable 来使对 Java 库的访问更加类型安全,但遇到了障碍。我不确定我是否滥用了该库,是否必须手动提供类型类实例,或者是否有其他问题。 此代码演示了我的问题
我是一名优秀的程序员,十分优秀!