- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
考虑这个伊莎贝尔代码
theory Scratch imports Main begin
datatype Expr = Const nat | Plus Expr Expr
plus
是很合理的键入 class 以获得
Plus
的良好语法构造函数:
instantiation Expr :: plus
begin
definition "plus_Exp = Plus"
instance..
end
+
和
Plus
仍然是单独的常量。特别是,我不能(轻松)使用
+
在函数定义中,例如
fun swap where
"swap (Const n) = Const n"
| "swap (e1 + e2) = e2 + e1"
Malformed definition:
Non-constructor pattern not allowed in sequential mode.
⋀e1 e2. swap (e1 + e2) = e2 + e1
最佳答案
Isabelle 中的类型类实例化总是为类型类的参数引入新的常量。因此,你不能说 plus
(写作中缀为 +
)应与 Plus
相同.但是,您可以反过来,即先实例化类型类,然后再将类型类上的操作声明为数据类型的构造函数。
一个这样的案例可以在理论Extended_Nat中找到。哪里类型enat
通过 typedef
手动构建,然后实例化无穷大类型类,最后enat
使用 old_rep_datatype
声明为具有两个构造函数的数据类型.然而,这是没有类型变量的非递归数据类型的一个非常简单的情况。对于您的表达式示例,我建议您执行以下操作:
expr_aux
与 datatype expr_aux = Const_aux nat | Plus_aux expr_aux expr_aux
. expr
作为 expr_aux
的类型副本与 typedef expr = "UNIV :: expr_aux set"
和 setup_lifting type_definition_expr
. Const_aux
至 expr
带吊装包:lift_definition Const :: "nat => expr" is Const_aux .
plus
:instantiation expr :: plus begin
lift_definition plus_expr :: "expr => expr => expr" is Plus_aux .
instance ..
end
expr
作为 old_rep_datatype expr Const "plus :: expr => _"
的数据类型和适当的证明(使用 transfer
)。 abbreviation Plus :: "expr => expr => expr" where "Plus == plus"
free_constructor
命令注册构造函数
Const
和
plus :: expr => expr => expr
作为
expr
的新构造函数实例化之后。如果然后添加“Plus = plus”作为简单规则,这应该几乎与乏味的方式一样好。然而,我不知道各种包(特别是 case 语法)如何处理构造函数的这种重新注册。
关于typeclass - 类型类实例化中的现有常量(例如构造函数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30759140/
Require Import Relations RelationClasses. Section MySection. Variable A : Type. Variable R : rel
我试图编译这段代码。 symmetric [] = True symmetric [_] = True symmetric l | (head l) == (last l) = symmetr
我正在尝试制作 Semigroup和 VerifiedSemigroup我的自定义实例 Bool运算符 && 上的数据类型和运算符(operator) || : %case data Lógico =
我为 Int 类型的类型类 Ord 定义了一个命名实现。 [mijnOrd] Ord Int where compare n1 n2 = ... 如何导入此命名实现并将其用作“默认” 所以在另一个
我写了一个 Haskell 风格的 Functor 类型类: Class Functor (f: Type -> Type) := { map {a b: Type}: (a -> b) -> (
我缺少什么关键的直觉来理解这段代码?我不明白这些是怎么组成的。首先需要一个函数 (a->c) 和构造类型 (f a b)。然而,第二个产量(f a d)。此外,first 和 second 是根据 b
如何在 Coq 中展开类实例?似乎只有当实例不包含证明或其他东西时才有可能。考虑一下: Class C1 (t:Type) := {v1:t}. Class C2 (t:Type) := {v2:t;
我一直在尝试使用指定 eval 函数的 Component 类型类在 Purescript 中开发组件系统。 eval 函数可以由组件的每个子组件递归调用,实质上是获取输入的值。 由于组件可能希望使用
我无法理解Coq中类型类和相关记录之间的区别。引用手册提供了类型类的语法,但没有说明它们的真正含义以及如何使用它们。一点思考和搜索表明,类型类本质上是从属记录,带有一些语法糖,可以使Coq自动推断一些
考虑这个伊莎贝尔代码 theory Scratch imports Main begin datatype Expr = Const nat | Plus Expr Expr 实例化 plus 是很合
因此,我有一对类型类,我将经常一起使用它们,并且我想避免每次都指定它们。基本上,而不是把 :: (Ord a, Fractional a, Ord b, Fractional b, ... Ord z
我一直在读《Learn You a Haskell》一书,并且正在尝试了解 Haskell 类型类。作为练习,我尝试创建一个简单的向量类型类。下面的代码片段让我有些悲伤(导致我在 StackOverf
我正在尝试在 Nim 中简单地使用类型类。请记住,我从今天早上才开始使用 Nim,所以我可能做了一些愚蠢的事情。 无论如何,我想定义一个伪随机生成器来生成 T 类型的值流。有时 T 是数字,因此了解可
我正在尝试抽象出针对特定类型触发的 json 解析逻辑。 我开始创建 Parser 特征,如下所示: trait Parser { def parse[T](payload : String) :
我现在在一个项目上使用 PureScript 并遇到了一些实例(我是新手,并且正在像我一样学习)。基本上我必须创建一个实例才能重载具有不同类型的函数。 public String toStr(Inte
我正在尝试编写一个类型类,以简化使用持久性、aeson 和 scotty 编写 CRUD 后端 这是我的想法: runDB x = liftIO $ do info CRUD a where
我正在尝试在 Haskell 中编写一个简单的遗传算法。我认为第一步应该是为“遗传”的个体创建一个类型类,如下所示: class Genetic a where fitness :: (Ord
为什么 mathlib 对 UFD 的定义是这样的: class unique_factorization_domain (α : Type*) [integral_domain α] := (fac
我有一个非常简单的data,我想使用Show类型类来给它一个很好的输出。 data Fruit = Apple | Orange Int instance Show Fruit wh
我想为大多数类型提供一个 ToCondition 操作,但不为字符串提供。 (这是在移植 Javascript 代码时,经常进行非空和非零测试,重写所有此类测试以进行适当比较非常乏味)。这样做很容易,
我是一名优秀的程序员,十分优秀!