在浏览gcc当前新C++ 11标头的实现时,我偶然发现了"......"令牌.您可以检查,以下代码编译正常 [通过ideone.com].
template <typename T>
struct X
{ /* ... */ };
template <typename T, typename ... U>
struct X<T(U......)> // this line is the important one
{ /* ... */ };
Run Code Online (Sandbox Code Playgroud)
那么,这个令牌的含义是什么?
编辑:看起来如此修剪"......"的问题标题为"......",我的意思是"......".:)
有一个伊德里斯教程后,阿格达教程和许多其他的教程式的论文和介绍材料与永无止境的事情引用还得学习.我有种爬行在所有这些中间,大部分时间我坚持用数学符号和新的术语没有解释突然出现.也许我的数学很糟糕:-)
是否有任何有纪律的方法来处理依赖类型编程?就像当你想学习Haskell中,你开始与"教你一个Haskell",当你想了解斯卡拉,你开始Odersky的书,对Ruby你读与它的突变臭虫怪异的教程.但我不能用他们的书开始阿格达或伊德里斯.他们远远超过我的头脑.我试过Coq并且陷入了它的全部证明风格.Agda需要巨大的数学背景和伊德里斯,好吧,让我们暂时离开吧!
我非常了解静态类型系统,我对Scala非常熟练,如果有必要,我可以使用Haskell.我理解功能范例并且日复一日地使用它,我理解代数数据类型和GADT(实际上相当顺利),我最近成功地理解了Lambda Cube.不过,我缺乏数学和逻辑部分.
在类别理论中,monad可以用两个伴随的仿函数构造.特别是,如果C和D是类别而 F:C - > D和G:D - > C是伴随函子,在某种意义上说是双射
hom(FX,Y)= hom(X,GY)
对于每个X在Ç和ÿ在d然后该组合物克邻FⅧ:C - "ç是一个单子.
一种这样的一对伴随函子可以通过固定式给出b,并采取F与G被
data F b a = F (a,b)
data G b a = G (b -> a)
instance Functor (F b) where
fmap f (F (a,b)) = F (f a, b)
instance Functor (G b) where
fmap f (G g) = G (f . …Run Code Online (Sandbox Code Playgroud) 我只是在阅读工作中的依赖类型.在参数化类型的介绍中,作者在本声明中提到了这一点
data List (A : Set) : Set where
[] : List A
_::_ : A ? List A ? List A
Run Code Online (Sandbox Code Playgroud)
Listis 的类型Set ? Set并且A成为两个构造函数的隐式参数,即.
[] : {A : Set} ? List A
_::_ : {A : Set} ? A ? List A ? List A
Run Code Online (Sandbox Code Playgroud)
好吧,我试着改写它有点不同
data List : Set ? Set where
[] : {A : Set} ? List A
_::_ : {A : Set} ? A ? List A …Run Code Online (Sandbox Code Playgroud) 我被证明的一些性质filter和map,一切都相当不错,直到我无意中发现这个属性:filter p (map f xs) ? map f (filter (p ? f) xs).以下是相关代码的一部分:
open import Relation.Binary.PropositionalEquality
open import Data.Bool
open import Data.List hiding (filter)
import Level
filter : ? {a} {A : Set a} ? (A ? Bool) ? List A ? List A
filter _ [] = []
filter p (x ? xs) with p x
... | true = x ? filter p xs
... | false = filter p xs
Run Code Online (Sandbox Code Playgroud)
现在,因为我喜欢用 …
在今天早些时候提出的问题以及大量相似的主题问题之后,我在这里从标准的角度询问这个问题.
struct Base
{
int member;
};
struct Derived : Base
{
int another_member;
};
int main()
{
Base* p = new Derived[10]; // (1)
p[1].member = 42; // (2)
delete[] p; // (3)
}
Run Code Online (Sandbox Code Playgroud)
根据标准(1)是格式良好的,因为Dervied*(这是new-expression的结果)可以隐式转换为Base*(C++ 11 draft,§4.10/ 3):
类型为"指向cv D的指针"的prvalue ,其中D是类类型,可以转换为类型为"指向cv B的指针"的prvalue ,其中B是D的基类(子句10).如果B是D不可访问(第11条)或模糊(10.2)基类,需要这种转换的程序是不正确的.转换的结果是指向派生类对象的基类子对象的指针.空指针值将转换为目标类型的空指针值.
(3) 由于§5.3.5/ 3导致未定义的行为:
在第一个备选(删除对象)中,如果要删除的对象的静态类型与其动态类型不同,则静态类型应为要删除的对象的动态类型的基类,静态类型应具有虚拟析构函数或行为未定义.在第二个备选(删除数组)中,如果要删除的对象的动态类型与其静态类型不同,则行为未定义.
(2)根据标准是合法的还是会导致形成不良的程序或不明确的行为?
编辑:更好的措辞
我试图找出类型层次结构如何在Agda中工作.
假设我定义了一个集合类型X:
X : Set
Run Code Online (Sandbox Code Playgroud)
然后继续构建归纳型
data Y : X -> Set where
Run Code Online (Sandbox Code Playgroud)
是什么类型的X -> Set?是设置还是类型?
谢谢!
嘿家伙所以这里是我的代码,我得到了"镜像的多重声明"的奇怪错误.我之前有其他功能,但没有一个被命名为镜像......有什么想法吗?
mirror :: BinTree a -> BinTree a
mirror = undefined
mirror (Node tL x tR) = Node x mirror tR mirror tL
Run Code Online (Sandbox Code Playgroud)