- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
类型类非常出色,因为它们允许我们将额外的结构连接到现有类型。从而使我们能够推迟一些设计决策,而不是在构思时匆忙做出决定。
另一方面,例如,在面向对象编程中,我们被迫考虑类型需要立即执行什么操作,以及稍后出现的或需要的任何附加结构将被合并到子类型中。万事皆有其目的。我想知道在 Agda 的背景下什么时候最好选择其中之一。
将以下内容用于 n
-ary 函数 s → s → ... → s → t
,
Func : ∀ {ℓ} (a : ℕ) (s : Set ℓ) (t : Set ℓ) → Set ℓ
Func zero s t = t
Func (suc a) s t = s → Func a s t
在定义编程语言的语法时,我们可能会将类型符号视为一个命名项,该命名项是通过采用许多其他此类命名项而“形成”的,并且它的含义是可以理解的通过采用上述参数并生成具体 Agda Set
的操作。
record Type₁ : Set₁ where
constructor cons₁
field
name₁ : String
arity₁ : ℕ
paramters₁ : Vec Type₁ arity₁
semantics₁ : Func arity₁ Type₁ Set
open Type₁
因此我们将符号和解释打包为一种类型。或者,我们可以将两者分开:
record Type₂ : Set₁ where
constructor cons₂
field
name₂ : String
arity₂ : ℕ
paramters : Vec Type₂ arity₂
open Type₂ {{...}}
record HasMeaning (t : Type₂) : Set₁ where
field
semantics₂ : Func (arity₂ {{t}}) Type₂ Set
open HasMeaning {{...}}
( 请注意,由于使用 Func,我们需要
上面的 Type2
存在于 Set₁
中,尽管它确实存在于 Set
中HasMeaning
中。)
哪个最好,为什么?特别是从编程的角度来看哪个更好,从证明的角度来看哪个更好?
假设我们实际上想用我们的类型(符号)做一些事情,例如将它们解释为实际的 Agda 类型,那么我们可以使用第一个定义轻松做到这一点:
⟦_⟧₁ : Type₁ → Set
⟦ cons₁ name₁ 0 [] semantics₁ ⟧₁ = semantics₁
⟦ cons₁ name₁ (suc n) (hd ∷ tl) semantics₁ ⟧₁ =
⟦ cons₁ name₁ n tl (semantics₁ hd) ⟧₁
没什么聪明的。如果没有“参数”,那么语义函数必然是一个 Agda Set
,我们就完成了;否则,我们将第一个类型参数提供给语义函数并递归以获得具体的Set
。
第二个定义有点烦人,因为每次我们想要使用类型的语义时都需要放置类型类约束,这对我来说太多了!
⟦_⟧₂ : (t : Type₂) {{_ : HasMeaning t}} → Set
⟦ cons₂ name₂ 0 [] ⟧₂ {{s}} = semantics₂ {{s}}
⟦ cons₂ name₂ (suc n) (hd ∷ tl) ⟧₂ {{s}} =
⟦ cons₂ name₂ n tl ⟧₂
{{ record { semantics₂ = semantics₂ {{s}} hd } }}
更糟糕的是,如果我们有冲突的语义实例怎么办?也许我们最多只需要一个实例,我们如何实现这一目标?
所以,就我的目的而言,似乎第一个是最好的......或者不是......
第二个定义明确承认可判定的相等性,因为自然数和字符串具有可判定的相等性。然而,第一个原因并不在于解释功能。当两个类型(符号)具有相同的名称、属性和参数时,可以通过说它们完全相同来回避这个问题;无论解释如何:
postulate eq₁-desire : ∀ {n a p S T} → cons₁ n a p S ≡ cons₁ n a p T
遗憾的是,这并没有给我们提供计算,这可以通过使用 trustMe 来修复。 .
据我所知,从上面的漫谈来看,第一种方法和 trustMe
是可行的方法。但是,我不太习惯使用 trustMe
---我对此知之甚少。
任何关于走哪条路的建议,或者任何关于采取哪种方法的理由,我们将不胜感激。谢谢!
最佳答案
我认为,首先您应该将名称-数量-语义部分与类型
分开。由于每个 Type
都可以强制转换为 Set
,因此您可以将语义表示为从 Set
到 Set
的函数而不是从 Type
到 Set
(与您的 Type₁
不同,这也是严格正数)。其外观如下:
record Atom : Set₁ where
constructor packAtom
field
name : String
arity : ℕ
semantics : Func arity Set Set
record Type : Set₁ where
inductive
constructor packType
field atom : Atom
open Atom atom
field parameters : Vec Type arity
mutual
⟦_⟧ : Type -> Set
⟦ packType (packAtom n ar sem) ts ⟧ = ⟦ ts ⟧s sem
⟦_⟧s : ∀ {ar} -> Vec Type ar -> Func ar Set Set -> Set
⟦ [] ⟧s A = A
⟦ t ∷ ts ⟧s F = ⟦ ts ⟧s (F ⟦ t ⟧)
那么你的问题可以重述为“有没有办法强制数量
和语义
由名称
确定?”。但 Agda 并不强制实例的全局唯一性。此外,您似乎想要内化一个元定理“每个名称
都有一个唯一的语义
”,因此您可以在代码中使用它,但那就是想要的太多了。您能举例说明为什么需要这样做吗?
关于haskell - 关注点分离 : when is it best to disassociate semantics from syntax?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36874369/
上下文 我有一个日间 TUMBLINGWINDOW(类似于下面所示的) SELECT DATEADD(day, -1, System.Timestamp()) AS WindowStart
因此,我正在开发一个非常小的 Web 组件,以作为更大的设计系统的一部分。 我对网络组件的使用有点陌生,但我知道这个特定的网络组件可以在一个布局中使用很多很多次。 此 Web 组件控制在传递给它的任何
我刚刚开发了一个 Android 应用程序(minSdkVersion 23/targetSdkVersion 29),可以连接到 BluetoothLE 设备以定期获取数据。 现在,在 MainAc
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
我一直在阅读有关 Airplay SDK 和 Dragonfire SDK 的内容。这些是在没有 Mac 的情况下进行 iphone 开发的合法选择吗?大家有更好的解决办法吗? 最佳答案 由于签名等原
我正在考虑使用 DTO 而不是传递我的域对象。我在这里和其他地方都读过几篇文章,我知道有几种方法可以完成这项工作。 如果我总共只有大约 10 个域类,并且考虑到我想在我的 View (WPF 前端)中
我的问题是,如果我有一个列表 list = [1,2,3,4,5,6,7] 如果我想知道这个列表中元素的数量,是len(list) 或 list.count 更好的选择?还是 .count 仅适用于来
我想知道 Django Rest Framework 的最佳实践。我一直通过每个用户使用不同的序列化程序(员工、帐户所有者、其他人)和 HTTP 方法来限制更改帐户上某些属性的访问权限,但我觉得这太不
我有数百个用于测试组件的脚本。这些脚本中的每一个都包含一组下标和单独的记录。 下标可以在多个 TC_Level 脚本中使用,甚至可以在其他下标中使用。 每个脚本都有一个唯一的名称。 例子: TC_1
我正在建立一个以两种语言提供产品信息的网站:英文和中文。 每个产品必须有英文名称,也可以有中文名称。 每次请求产品页面时,request检查对象以确定产品名称应该以英文还是中文显示。在后一种情况下,如
场景:应用程序具有可以启用某些优化的算法。默认情况下,有些是打开的,有些是关闭的。在 Java 中是否有一种方便的方法来实现某种全局属性系统? 要求: 必须很容易两次使用不同的设置运行程序的多个实例
我从事嵌入式工作,我有一些管理硬件的软件模块。这个模块有状态,状态转换很复杂:根据事件,模块可以从状态 A 到状态 B 或者可能到 C .但是,当它退出某个状态时,它应该对硬件执行一些操作,以使其也保
我有一个免费网站,可以流式传输实时股票期权数据。我想让用户制作并保存他们自己的 JavaScript 可调用工具来解释选项数据。用户可以调用这些自定义工具来帮助他们自己做出有关期权的买卖决定。 但对于
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 2 年前。 社区在 6 个
我不是 DBA,我不知道什么是最好的解决方案。我有两个表, Custumers Table CustomerId (primary key, identity) ... 和 Suppliers Tab
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 7年前关闭。 Improve t
我一直在阅读关于版本控制主题的所有问题,但我认为我没有找到一个看起来像我自己的场景。 场景是: 我们有一个中型/大型 Web 应用程序,它有(至少应该有)一个部署到所有客户端的核心。当我们向客户演示应
我希望根据继承来组织一些项目,目的是确定哪些项目是连接最密集的父项,并且还只是看到形成的连接。 通常这将通过拓扑排序来完成,但我的图有循环。是否有类似“尽力而为”拓扑排序的东西,它可以尝试根据连接数或
以下在 JQuery 中附加事件处理程序的方法有什么区别? (function () { var $body = $("body"); $('button').click(functi
我是一名优秀的程序员,十分优秀!