首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

用了一段时间Agda的感想

我的第一感觉就是,Agda真的很好入门。Agda的语法和Haskell几乎完全一致,而且由于Agda支持Unicode,于是代码中可以使用大量的数学符号,可以很简单的将一个命题翻译为Agda代码。...在证明方面,Agda和Coq有本质的不同。虽然都以有类型λ演算为理论基础(Agda是UTT,Coq是归纳构造演算),但是表现在证明上,两者就有很大的不同了。...在Agda中,命题的证明就是给出一个类型的一个项。可以说,在Agda中证明一个命题能充分体现Curry-Horwad同构的实质。...进一步的说,Agda根本没有强调“证明”,而你的每一次证明,其实都是C-H同构的体现。而Coq却完全相反。Coq使用了不同的Tactics来辅助证明。在Coq中进行证明的过程更加类似于一般的数学证明。...而针对这个目标,Agda提供了比如Case和Refine之类的工具来根据类型生成目标代码,这一点是十分方便的。但是缺点也显而易见,就是证明过程并不按照一般的证明顺序进行的,毕竟只是项的构造。

1.3K10

分享pycharm如何安装插件(Plugins)

插件下载地址:https://plugins.jetbrains.com/pycharm,pycharm的官网也是有点慢阿,不过用谷歌浏览器配合迅雷插件很多东西都很快,比如sourceforge.net...推荐一个插件Rainbow Brackets,这个插件叫彩虹屁,它可以让你的代码块之间很清晰的显示出各种颜色的高亮,而且支持的编程语言还居多,比如:Java, Scala, Clojure, Kotlin..., Python, Haskell, Agda, Rust, JavaScript, TypeScript, Erlang, Go, Groovy, Ruby, Elixir, ObjectiveC,...一、把插件的zip文件下载到本地 二、File=>settings=>plugins 本来可以像vscode一样直接搜直接安装(有时候可以有时候不可以),但是它一直转不出来,所以我先去上面的官网下载插件到本地再安装...三、点开updates后面的小齿轮,选择install plugin from disk(从硬盘下载),选择刚刚下载的zip文件就可以了 四、重启一 发布者:全栈程序员栈长,转载请注明出处

1.9K20
您找到你想要的搜索结果了吗?
是的
没有找到

【Rust日报】2023-10-31 RustyDHCP - 轻量级且简约的 DHCP 服务器

RustyDHCP - 轻量简约的 DHCP 服务器 RustyDHCP 是一个轻量简约的 DHCP 服务器,无 unsafe 代码,有如下特点: 无外部依赖,仅需 Rust 易于使用和配置 快速高效...他用 JavaScript 和 Rust 比较了几个场景,如数组遍历、数据库类型检查、并发数据访问等,说明了 Rust 如何通过强类型系统、所有权机制、可变性控制等特性来强制开发者考虑潜在的逻辑错误,并在编译时发现和修复它们...作者也提到了一些其他的形式化验证方法,如 Agda 和 Coq 等,但它们超出了本文的范围。...该项目的目标是为 Rust 编译器创建一个基于 Cranelift 的代码生成后端(类似 LLVM),这有可能优化 debug 模式的编译时间。 自上次的进展报告以来,有很多令人兴奋的进展!...在堆栈展开时进行清理:Cranelift 目前不支持在堆栈展开期间进行清理。

24920

【错误记录】Kotlin 代码运行时报错 ( 成员属性初始化顺序是按照从上到顺序进行的 , 上面的属性不要调用下面未进行初始化的属性 )

文章目录 一、报错信息 二、问题分析 三、解决方案 该问题的本质就是 , 成员属性初始化顺序是按照从上到顺序进行的 , 上面的属性不要调用下面未进行初始化的属性 ; 一、报错信息 ---- 执行下面的代码...initName() = "Tom $age" } fun main() { var h = Hello(18) println(h.name) } 得到的结果是 : Tom 0 在上述代码的构造函数中...但是最终打印出来的数据为 0 ; 二、问题分析 ---- Kotlin 类 对象在实例化 时会执行一系列的 初始化操作 , 这些操作按照如下顺序执行 : 主构造函数 中属性赋值 类中的属性赋值 init 初始化块 中的代码执行...次构造函数 中的代码执行 在下面的代码中 , class Hello(_age: Int){ var name: String = initName() var age = _age...; 因此最终打印出的 name 结果是 Tom 0 ; 三、解决方案 ---- 成员属性初始化顺序是按照从上到顺序进行的 , 上面的属性不要调用下面未进行初始化的属性 ; 调换 age 属性与 name

40610

用于数学的 10 个优秀编程语言

它允许表达数学断言,机械地检查这些断言的证明,帮助找到形式化的证明,并从其正式规范的建设性证明中提取认证程序。 Coq工作在归纳结构微积分理论的基础上,归纳结构微积分是结构微积分的一个衍生物。...IDRIS Idris是一种具有相关类型的通用纯函数编程语言。类型系统类似于Agda使用的类型系统。 语言支持可与Coq媲美的交互式定理证明,包括策略,即使在定理证明之前,重点仍然放在通用编程上。...其设计理念强调代码可读性,其语法允许程序员用比C ++或Java等语言更少的代码行来表达概念。 该语言提供了旨在实现小规模和大规模清晰程序的构造。...它具有动态类型系统和自动内存管理,并有一个大而全面的标准库。...如果你对处理数据操作和分析的新方法感兴趣,那么值得尝试一。 下面是一个quicksort的实现——只是为了让你知道我们在这里处理什么。

3.1K100

6 个新奇的编程方式,改变你对编码的认知

这篇文章中,我想分享一让我惊讶的发现。这不是类似于高呼“函数式编程会改变世界!”博客文章。我敢打赌,大多数读者都没有听说过下面的大多数语言和范例,所以你应该也会被这些新概念吸引。...默认并发 示例语言:ANI, Plaid 让我们用一个哲学家的思想来解决问题吧:有些编程语言是默认情况并发的,也就是说,每行代码都是并行执行的。...相关类型 示例语言:Idris, Agda, Coq 你可能习惯使用C和Java等语言来键入系统,编译器可以检查变量是整数,列表还是字符串。...Shapeless 是一个仍然有点粗糙的库,只支持依赖类型的一个子集,并有相当冗长的代码类型签名。相反,Idris使得类型成为编程语言的第一类成员,因此依赖类型系统似乎更加强大和干净。...上面的排序算法很可能 O(n!)让数独解算器进行了一次强力搜索; 而且大多数开发人员必须提供数据库提示和额外索引,避免执行SQL查询时出现代价高昂且效率低下的情况。

2.3K50

改变开发者编码思维的六种编程范式

Plaid还探讨了其它有趣的概念,如面向类型状态的编程,在那里状态转换成为了语言中的重要因素:你定义的对象不再是类,而是一系列可以由编译器检查的状态和转换。...依赖类型 (Dependent types) ? 示例语言:Idris, Agda, Coq 你可能习惯于像C和JAVA等语言的类型系统,编译器可以检查一个变量是整数,列表,或者字符串。...但是如果你的编译器可以检查一个变量是“正整数”,“长度为2的列表”,还是“一个回文字符串”会怎样呢? 这就是支持依赖类型语言背后的思想:你可以在编译时指定检查变量值得类型。...Shapeless是一个了不起的库,但在我看来,它仍然有点粗糙,只支持依赖类型的一个子集,并导致生成相当详细的代码类型签名。...将前面的C语言解决方案和下面的Prolog代码进行对比: sort_list(Input, Output) :- permutation(Input, Output), check_order(

2.1K100

TypeScript: 请停止使用 any

在这些情况,我们可能要选择退出类型检查。为此,我们将这些值标记为 any 类型: 什么是 any 因此 any 不是通配符,也不是基类型,它是明确地与第三方库进行交互。那它为什么经常出现你呢?...但是等等我还有很多其他原因 TypeScript 不会转换为 Javascript 吗?Javascript 不是动态的吗?那我为什么要考虑我的类型呢? 是的!...我已经通过必要的运行时检查以防御性的方式编写了代码,以确保没有错误 现在可能没有错误,但是除非你有很好的测试覆盖率,否则以后来修改代码的人不会相信他们不是在错误中重构;就好像编译器不会帮你,因为我们说过它不会帮你...在这些情况,我们需要 100% 确保不存在会导致函数失败的类型。我们应该检查函数的主体,并根据输入确定最基本的形状并加以限制。...让我们回顾一 为什么我们不能在使用 any ?

1.1K21

TypeScript 官方手册翻译计划【一】:基础

再次重申,对代码进行类型检查,会限制可以运行的程序的种类,因此类型检查器会进行权衡,以确定哪些代码是可以被接受的。大多数时候这样没什么问题,但有的时候,这些检查会对我们造成阻碍。...最后,你不得不花费时间解决类型检查器抛出的错误,但问题在于,原始的 JavaScript 代码本身就是可以运行的!为什么把它们转换为 TypeScript 代码之后,反而就不能运行了呢?...这也是 TypeScript 默认提供的开发体验,类型是可选的,推断会使用最松散的类型,对于潜在的 null/undefined 类型的值也不会进行检查。...这些严格性设置将静态的类型检查从一种切换开关的模式(对于你的代码,要么全部进行检查,要么完全不检查)转换为接近于刻度盘那样的模式。你越是转动它,TypeScript 就会为你检查越多东西。...noImplicitAny 回想一,在前面的某些例子中,TypeScript 没有为我们进行类型推断,这时候变量会采用最宽泛的类型:any。

87710

多用as少用强制类型转换

下面我们就来讲解一为什么多使用 as 少使用强制类型转换。 零、as and is 使用 as 进行类型转换会比强制类型转换更加安全,而且运行时效率更高。...但是这里有一点需要注意的是 as 和 is 运算符不会考虑用户所定义的类型转换,只有当运行期的类型与要转换到的类型相符时才能顺利进行。...as 和 is 运算符除了必须进行的装箱和拆箱外,它不会执行其他任何操作,也就是说 as 和 is 只会判断带转换对象在运行期是什么类型,并根据结果进行相应的处理。...但是要注意的是强制类型转换可以会造成信息丢失,例如从 long 强制转换为 short 。 在某些情况利用强制类型转换从代码上来看似乎可以转换成功,但实际上却转换不成功。这时为什么呢?...同样,先来看一小段代码: object obj =Factory.GetValue(); int num = obj as int; 上面的这段代码运行起来后将会报错,为什么呢?

1.4K10

TypeScript 的魔法技能:satisfies

让我们从使用 TS 的标准类型声明重写上面的示例来进行一个对比: type Route = { path: string; children?...例如,下面这行代码编译得很好,但会在运行时会抛出错误: routes.NONSENSE.path // TypeScript 报错:发现这个路由属性不存在 为什么会这样?...path: '/login' } } }, HOME: { path: '/' } } satisfies Routes 我们从下图中看到,IDE 自还是能够帮助你进行自动补全和类型检查...例如,下面的代码中, const routes = { HOME: { path: '/' } } satisfies Routes 如果我们检查 path 属性的类型,我们会得到字符串类型: routes.HOME.path...对于 as const,在创建对象时,我们不会对对象本身进行任何类型检查。因此,这意味着在我们的 IDE 中没有自动检查,也没有在编写时对错别字和其他问题的警告。 这就是为什么进行组合的原因。

31510

为什么eslint没有 no-magic-string?

本文通过讲解什么是魔法数,eslint 是怎么检查魔法数的,以及思考为什么eslint 偏爱数字,而不是偏爱字符串来 来深入剖析一魔法数。 计算机科学中的魔法数 什么是魔法数?...为什么面的代码被认为是好的?...这和我们的想法这条规则只会检查魔法数字,而不会检查诸如魔法字符串等。 让我们时光倒流,将代码回退到 eslint 官方首次关于”no-magic-rule”的提交。...image.png 代码大概意思是: 如果是变量声明语句,就去检查是否强制使用const。如果是则观察语句是否为const 声明。 对于其他情况,直接检查父节点的类型。2.1....如果大家写 babel 插件的话,相应的引擎最好修改一。 值得注意的是,上面我们用的parent是不会在ast-explorer 进行显示的。

1.6K10

.Net8顶级性能优化:类型转换

本篇来看下它其中的一个优化:类型转换的优化效果。 2.示例 通过类型检查的优化,优化掉某些情况类型转换的时候JIT类型检查的函数。下面的代码类型检查的典型应用。...通常情况ldelema需要进行类型检查,也就是用JIT辅助函数CORINFO_HELP_LDELEMA_REF来进行检查,以确保不会违反类型安全性。...这个安全性的检查会极大损耗性能,.NET8的JIT进行了一个优化,思路是如果是sealed关键字标记的类型,就不会进行安全性检查,这样就会提高性能。为什么sealed不会呢?...这其实是利用了它的一个特性,就是不会被继承。不会被继承,就不会被子类的类型所困扰,只有string一个类型,自然不会用以进行类型检查了。 这是第一点优化,下面看下。...> { //这里代码省略 } JIT会判断类型是否是sealed标志,如果是则不进行安全性检查优化。

33670

TypeScript基础——基本类型检查

为什么要使用TypeScript?...基本类型检查 1. 如何进行类型约束 类型约束其实很简单,只需要在变量、函数参数、函数返回值位置上加上:类型就可以了。...:表示任意类型,对该类型,TS不进行类型检查 看到这,我想大家已经知道TS有非常强大的类型检查系统,那么有个小问题 灵魂一问: 请问手机号应该定义成数字还是数字字符串?...Error(msg) } 由于是永远不会结束,所以,下面的log函数无法执行,无法访问代码 还有一种情况也是永远不会结束,需要手动约束 字面量类型:使用一个值进行约束,而不是类型约束 //表示从此以后...意味着代码提示中不会出现所有数字拥有的方法或者所有字符串所拥有的方法,只会提示数字和字符串共同拥有的方法——toString和valueOf如下图: 解决方案: 加上下面两句代码,这两句代码相当于告诉

1.2K10

碰见异常 你是选就地正法 还是甩锅大法 码思客

try-catch 上面这个try-catch结构就是基本的捕获异常结构,try后面的程序就是正常的逻辑代码,catch后面是如果发生了异常需要执行的代码。...这样就导致无法根据不同的异常进行不同的异常处理。当一段逻辑中出现多个需要捕获的异常的时候,可以在try后面接多个catch,分别对不同的异常类型进行捕获。 ?...因为有一些代码如果写在try中,如果出现异常,那么这些代码是可能不会被执行的,如果写在catch中,如果不发生异常也不会执行,所以需要一个地方来写无论是否出现异常都会被执行的代码。 ?...前面说了检查异常,有没有想过,为什么检查异常就必须处理呢?因为在定义类,方法的时候,源码已经将异常抛出了,所以你在使用类的时候就必须处理它,要么捕获,要么抛出。...跟catch可以捕获多种异常类型一样,throws也可以抛出多种异常类型,这样就可以让上一级的代码根据不同的异常类型分别进行处理。

46240

C# - 为引用类型重定义相等性

但是如果父类Equals()认为这两个实例是相等的,这就意味着父类里所有的相等性检查都通过了,然后我们仍然需要检查派生类里面的独有字段(属性),而这个例子里只有一个字段(属性)。...好,现在我们来测试一: ? 其结果如下: ? 这个结果还都是对值进行比较的,符合预期。 然后你可能以为这样实现没有问题了。。。。...这里面x和y其实都是BeijingCitizen的实例,但是现在所处的位置是其父类Citizen的==方法里,所以相等性检查会在这里发生,所以这个相等性检查只会检查父类里面的字段,Citizen这个类无法知道其它继承于它的类型...而所有这些实例的不同值就去别再IdCard这个派生类的字段上面了,所以所有检查的结果都是相等的,因为只比较了父类的那两个字段。 为什么会调用Citizen父类的==方法呢?...这是因为==的实现不是virtual的,在object类型上使用==就是判断引用的相等性。而你也无法在重载操作符来防止上述事情的发生,因为这段代码永远不会调用到你的操作符重载方法。

70920

Rust中打印语句为什么使用宏实现?

Rust中打印语句为什么使用宏?在Rust中,打印语句使用宏(例如println!和format!)的主要原因是为了在编译时进行字符串格式检查,并在不引入运行时开销的情况提供更高的性能和安全性。...Rust宏允许在字符串中插入变量,而在编译时,编译器可以检查这些插值是否与实际的变量类型匹配。这有助于捕获潜在的格式化错误,防止运行时发生类型不匹配或其他问题。...,其中的 {} 是占位符,表示后面的参数将填充到这些位置。在编译时,Rust会检查实际传递的参数是否与占位符的数量和类型匹配。2. 零成本抽象Rust中的宏提供了一种零成本的抽象。...这意味着使用宏并不会引入运行时开销。在编译时,宏会被展开为实际的代码。这意味着在生成的代码不会有额外的函数调用开销。相比之下,通过函数实现相同的功能可能会导致运行时开销。// println!...和类似的宏使得代码更加灵活、可重用,并允许在编译时进行更多的优化。这是 Rust 中推崇的一种编程风格,有助于编写安全、高性能的代码

16610

TypeScript必知三部曲(一)TypeScript编译方案以及IDE对TS的类型检查

为什么IDE打开ts项目的时候,就能有这些ts代码类型定义?为什么明明IDE对代码标红报错,但代码有能够编译出来?...也就是说,**babel处理TypeScript代码的时候,并不进行任何的类型检查!**那小伙伴可能会说,那如果我使用babel编译方案,怎么进行类型检查以确保ts代码的正确性呢?...,在babel编译方案中的类型检查的tsconfig.json需要我们配置noEmit为true,表明tsc读取到了ts源代码以后,不会生成任何的文件,仅仅会进行类型检查。...编译方案与IDE类型检查整合 综合前面的tsc编译与babel编译的过程,再整理上述的IDE对TS项目的类型检查,我们可以分别总结出tsc编译与babel编译两种场景的代码编译流程和IDE类型检查流程。...不会存在这样的情况:代码有编译问题,但是IDE不会红色显示类型检查问题。 再来看babel编译方案: 很显然,babel编译方案,代码编译与IDE的类型检查是两条路线。

29120

开发工具总结(8)之图文并茂全面总结上百个AS好用的插件(

你会发现依赖库变成了灰色,后面中括号里面就是方法数以及相关依赖信息等,点一就显示正常的依赖内容 【缺点】项目里面的modle依赖了一个自己写的lib,不能统计lib里的方法数 ?...初次打开时的显示 点击Settings后,会出现设置窗口,点击add,添加要统计代码的项目就可以了。 ? 进入设置页面 这里重点讲一设置里面每一项的意思: ?...Material Theme UI 示意图 ---- 2.Android Studio插件之sexy editor (设置AS代码编辑区的背景图) 进入设置界面 选择other Setting 的...Sexy Editor , 右侧 insert 一张或多张图片即可,上面的其他设置可以设置方位 间隔时间 透明度等等,设置完成后,要关闭打开的文件,重新打开项目文件即可在代码编辑区显示插入的图片,作为代码编辑区的背景图...查找结果 ---- 5.CheckStyle-IDEA(49M,有点大) 检查代码风格的插件,比如像命名约定,Javadoc,类设计等方面进行代码规范和风格的检查,你们可以遵从像Google Oracle

1.5K30
领券