- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
例如,尝试编译以下代码
{-# LANGUAGE StandaloneDeriving, KindSignatures, DataKinds, GADTs#-}
data ExprTag = Tag1 | Tag2
data Expr (tag :: ExprTag) where
Con1 :: Int -> Expr tag
Con2 :: Expr tag -> Expr tag
Con3 :: Expr tag -> Expr Tag2
deriving instance Eq (Expr a)
Could not deduce (tag1 ~ tag)
from the context (a ~ 'Tag2)
bound by a pattern with constructor
Con3 :: forall (tag :: ExprTag). Expr tag -> Expr 'Tag2,
in an equation for `=='
at Bar.hs:11:1-29
or from (a ~ 'Tag2)
bound by a pattern with constructor
Con3 :: forall (tag :: ExprTag). Expr tag -> Expr 'Tag2,
in an equation for `=='
at Bar.hs:11:1-29
`tag1' is a rigid type variable bound by
a pattern with constructor
Con3 :: forall (tag :: ExprTag). Expr tag -> Expr 'Tag2,
in an equation for `=='
at Bar.hs:11:1
`tag' is a rigid type variable bound by
a pattern with constructor
Con3 :: forall (tag :: ExprTag). Expr tag -> Expr 'Tag2,
in an equation for `=='
at Bar.hs:11:1
Expected type: Expr tag1
Actual type: Expr tag
In the second argument of `(==)', namely `b1'
In the expression: ((a1 == b1))
When typechecking the code for `=='
in a standalone derived instance for `Eq (Expr a)':
To see the code I am typechecking, use -ddump-deriv
最佳答案
正如其他人所指出的,问题的关键是存在量化 tag
在 Con3
的类型中.当你试图定义
Con3 s == Con3 t = ???
s
和
t
应该是具有相同
tag
的表达式.
Expr
s 在结构上,与标签无关。
instance Eq (Expr tag) where
(==) = heq where
heq :: Expr a -> Expr b -> Bool
heq (Con1 i) (Con1 j) = i == j
heq (Con2 s) (Con2 t) = heq s t
heq (Con3 s) (Con3 t) = heq s t
Con3
与存在量化的运行时见证
tag
.执行此操作的标准方法是使用单例结构。
data SingExprTag (tag :: ExprTag) where
SingTag1 :: SingExprTag Tag1
SingTag2 :: SingExprTag Tag2
SingExprTag tag
中的一个值将准确决定什么
tag
是。我们可以将这条额外的信息放入
Con3
如下:
data Expr' (tag :: ExprTag) where
Con1' :: Int -> Expr' tag
Con2' :: Expr' tag -> Expr' tag
Con3' :: SingExprTag tag -> Expr' tag -> Expr' Tag2
heqTagBoo :: SingExprTag a -> SingExprTag b -> Bool
heqTagBoo SingTag1 SingTag1 = True
heqTagBoo SingTag2 SingTag2 = True
heqTagBoo _ _ = False
Bool
类型的值。 ,不知道这个值(value)意味着什么,也不知道它的真相可能赋予我们什么。知乎
heqTagBoo a b = True
没有告诉类型检查器任何关于
a
的标签有用的信息和
b
证人。
bool 值有点无意义。
data x :=: y where
Refl :: x :=: x
singExprTagEq :: SingExprTag a -> SingExprTag b -> Maybe (a :=: b)
singExprTagEq SingTag1 SingTag1 = Just Refl
singExprTagEq SingTag2 SingTag2 = Just Refl
singExprTagEq _ _ = Nothing
Eq
的实例为
Expr'
使用
ExprTag
比较以证明对两个
Con3'
的递归调用是合理的当标签显示匹配时, child 。
instance Eq (Expr' tag) where
Con1' i == Con1' j = i == j
Con2' s == Con2' t = s == t
Con3' a s == Con3' b t = case singExprTagEq a b of
Just Refl -> s == t
Nothing -> False
关于haskell - 如何使用非 * 类型的幻影类型参数为 GADT 导出 Eq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13423961/
我是 PhantomJS 和 JavaScript 的新手。我的问题很基础,但是却给我带来了很大的困难。 我已成功将可执行文件的 PATH 添加到我的系统变量中,当我在命令提示符中键入“phantom
如何在 PhantomJS 中点击一个元素? page.evaluate(function() { document.getElementById('idButtonSpan').click(
我正在尝试在 Ubuntu 14.04 上安装 TortoiseHg。它运行良好,但试图打开它提示有一个不受支持的 Mercurial 版本(3.4.1)。我通过以下方式删除: sudo apt-ge
我有以下 Node 代码: var express = require('express'); var app = module.exports = express(); var phanto
我从简单开始: hoops=# select * from core_school limit 3; id | school_name | nickname ----+----------
我正在尝试使用phantom-jasmine 。我已经使用 npm 在我的系统(Mountain Lion 和 Ubuntu)上安装了 phantomjs (1.9.1) 和 phantom-jasm
当创建具有重要finalize()方法的对象时,JVM将创建Finalizer(FinalReference)并以此对象作为引用。如果这个对象也被软引用/弱引用或幻像引用包装,会发生什么? GC 是否
我正在尝试使用 Phantomjs 从用户所在的同一页面捕获屏幕截图。 例如,用户在 my-page.html 上对该页面的元素进行了一些更改,现在我需要对该页面内的元素(DIV)进行屏幕截图(my-
我正在尝试提取网页的特定元素,并将其保存为本地镜像。 node.js 代码,使用 phantom-node: var phantom = require('phantom'); phantom.cre
我正在使用 PhantomJS 2 点击页面元素。但是,我不知道点击这些元素是否会触发事件(例如页面加载)。 我希望能够处理这两种情况: 当点击一个元素触发页面加载时,我想等到新页面加载完毕。 当点击
我希望模拟一个相当糟糕的 API,它具有重复数据的字段,因此我尝试创建一个 Mirage Factory 来生成一些随机数据 例如 import { Factory, faker } from 'em
使用 Intellij(v14 和现在的 v15),我设置了断点来调试来自外部依赖项(通常是快照版本)的尚未发布的类,用于在 Tomcat 7+ 中运行的 Web 应用程序。 当我将该外部依赖项更改为
从昨天开始,我遇到了 CasperJS 和一个站点的问题。从昨天开始就连不上服务器了。但是,我在 Windows 上的脚本运行良好。我的生产服务器上有这个错误: 2015-04-01T09:46:02
我正在尝试对一个从未完成过的按钮执行操作。 final Actions action = new Actions(mDriver); final WebElement myCart = mDr
我正在使用 HTML5 拖放。在 Windows 7 上进行拖放 (DnD) 期间,我在拖动项目时看不到幻影。它影响所有浏览器。如何让它显示? 最佳答案 您需要运行主题服务。这是你如何做到的。 开始
使用 PhantomJS 考虑以下代码片段: var reloadAfterLogin = false; function(user, pass, debug){ // step 3 submit L
按照 MSSQLTips 博客文章中的说明,我设置了带有 Foreach 循环的包,以循环遍历工作簿中的所有工作表并将数据导入表中。 循环正在查找正确的工作表 ( '11-18$' ),然后是具有更长
当我在 Node 中的 docker 中运行我的 phantomjs 应用程序时,它工作正常(将 HTML 转换为 Jpeg)。 但是,当我将它发布到 docker 容器时,字体名称不再受到尊重。 此
我是一名优秀的程序员,十分优秀!