fbpx
维基百科

Idris

Idris是一个通用的依赖类型纯函数式编程语言,其类型系统Agda以及Epigram英语Epigram (programming language)相似。

Idris
编程范型函数式编程
設計者Edwin Brady
发行时间2007年,​16年前​(2007[1]
当前版本
  • 1.3.3 (2020年5月23日)[2]
型態系統静态类型, 强类型, 依赖类型
操作系统跨平台
許可證BSD-3
文件扩展名.idr, .lidr
網站Idris
啟發語言
Agda, Coq, Epigram英语Epigram (programming language), Haskell, ML

Idris语言具备堪与Coq媲美的交互式定理证明能力,自带tactics,而其设计目标侧重于通用系统编程更甚于辅助证明。Idris的其他设计目标还包括“可观的”代码性能,对副作用的控制,以及对于实现嵌入式领域特定语言(Embedded Domain Specific Language,EDSL)的支持。

Idris通过一个依赖类型的核心语言TT生成C语言的中间代码并编译到本地机器码,并利用了一个基于Cheney算法垃圾收集器实现。Idris亦拥有 JavaScriptJavaLLVM的编译器后端。[4]

Idris的名字来自于20世纪70年代的英国儿童动画片《火车头艾弗英语Ivor_the_Engine#Idris_the_Dragon》里,一条会唱歌的[5]

语言特性 编辑

依赖类型 编辑

Idris 支持对依赖类型 )的定义。如下定义了 ,即元素类型   -元组类型:

data Nat = O | S Nat infixr 5 :: data Vect : Type -> Nat -> Type where  VNil : Vect a O  | (::) : a -> Vect a k -> Vect a (S k) 

嵌入式领域特定语言(EDSL) 编辑

Idris 对嵌入式领域特定语言的支持主要包括以下方面[6]

  1. 编译期间求值。
  2. 重载的语法。
  3. 与C语言库的接口,以及高效的代码生成

类型提供器(Type Provider) 编辑

Idris 拥有与 F# 相似的类型提供器,它允许编译器在编译期间根据所执行代码的需求而生成新的类型信息。这使得静态类型系统更具可扩展性。[7]

示例 编辑

语法 编辑

Idris 的语法与 Haskell 有许多相似之处。一个最简单的 Hello World 程序如下:

module Main main : IO () main = putStrLn "Hello, World!" 

该程序与 Haskell 的等效写法仅有两点不同:类型签名使用单个冒号“:”而不是双冒号“::”;开头的模块声明中不必使用 where 从句。

Idris 亦支持 where 从句、let 表达式、with 规则、简单的 case 表达式和模式匹配等。

依赖类型 编辑

一个在 Idris 中使用依赖类型的示例:

total append : Vect n a -> Vect m a -> Vect (n + m) a append Nil ys = ys append (x :: xs) ys = x :: append xs ys 

该函数将一个包含 m 个类型 a 的元素的 vector 连接到一个包含 n 个类型 a 的元素的 vector 之后。由于输入 vector 的确切类型依赖于它的值,故在编译(类型检查)时即可保证输出的 vector 必将包含 (n + m) 个类型 a 的元素。

关键字“total”将会执行函数的完整性(totality)检查。若函数定义未涵盖所有可能的情形(partial function),则检查器会报错。

另一个使用依赖类型的示例:

total pairAdd : Num a => Vect n a -> Vect n a -> Vect n a pairAdd Nil Nil = Nil pairAdd (x :: xs) (y :: ys) = x + y :: pairAdd xs ys 

Num a 标志着类型 a 属于 Type class英语Type class Num。注意在这里,该函数被认为是完整的(total),尽管并未定义一个参数是 Nil 而另一个参数非 Nil 的模式。原因在于两个作为参数的 vector 只能具备相同的长度,这一点通过依赖类型系统得到了保证,因此在编译时两者长度不同的情形绝无可能发生。这使得该函数定义仍然是完整的。

求值策略 编辑

Idris 默认采取及早求值(Eager evaluation),而非 Haskell 的惰性求值(Lazy evaluation)方式。Idris 支持使用 Lazy 关键字显式地指定惰性求值:

data Lazy : Type -> Type where  Delay : (val : a) -> Lazy a Force : Lazy a -> a boolCase : Bool -> Lazy a -> Lazy a -> a; boolCase True t e = t; boolCase False t e = e; 

参考文献 编辑

  1. ^ Brady, Edwin. . University of St Andrews School of Computer Science. 2007-12-12. (原始内容存档于2008-03-20). 
  2. ^ Release 1.3.3. 2020年5月23日 [2020年5月24日]. 
  3. ^ . [2020-05-25]. (原始内容存档于2021-02-04). 
  4. ^ . [2013-12-24]. (原始内容存档于2013-12-24). 
  5. ^ . [2013-12-24]. (原始内容存档于2012-03-11). 
  6. ^ Slides from Systems Programming with Dependent Types at DTP11 (PDF). [永久失效連結]
  7. ^ Christiansen, David. (PDF). 2013 [2014-08-26]. (原始内容 (PDF)存档于2017-08-09). 

外部链接 编辑

  • The Idris homepage(页面存档备份,存于互联网档案馆), including documentation, frequently asked questions and examples
  • Idris at the Hackage repository(页面存档备份,存于互联网档案馆

idris, 是一个通用的依赖类型纯函数式编程语言, 其类型系统与agda以及epigram, 英语, epigram, programming, language, 相似, 编程范型函数式编程設計者edwin, brady发行时间2007年, 16年前, 2007, 当前版本1, 2020年5月23日, 型態系統静态类型, 强类型, 依赖类型操作系统跨平台許可證bsd, 3文件扩展名, lidr網站啟發語言agda, epigram, 英语, epigram, programming, language, has. Idris是一个通用的依赖类型纯函数式编程语言 其类型系统与Agda以及Epigram 英语 Epigram programming language 相似 Idris编程范型函数式编程設計者Edwin Brady发行时间2007年 16年前 2007 1 当前版本1 3 3 2020年5月23日 2 型態系統静态类型 强类型 依赖类型操作系统跨平台許可證BSD 3文件扩展名 idr lidr網站Idris啟發語言Agda Coq Epigram 英语 Epigram programming language Haskell MLIdris语言具备堪与Coq媲美的交互式定理证明能力 自带tactics 而其设计目标侧重于通用系统编程更甚于辅助证明 Idris的其他设计目标还包括 可观的 代码性能 对副作用的控制 以及对于实现嵌入式领域特定语言 Embedded Domain Specific Language EDSL 的支持 Idris通过一个依赖类型的核心语言TT生成C语言的中间代码并编译到本地机器码 并利用了一个基于Cheney算法的垃圾收集器实现 Idris亦拥有 JavaScript Java和LLVM的编译器后端 4 Idris的名字来自于20世纪70年代的英国儿童动画片 火车头艾弗 英语 Ivor the Engine Idris the Dragon 里 一条会唱歌的龙 5 目录 1 语言特性 1 1 依赖类型 1 2 嵌入式领域特定语言 EDSL 1 3 类型提供器 Type Provider 2 示例 2 1 语法 2 2 依赖类型 2 3 求值策略 3 参考文献 4 外部链接语言特性 编辑依赖类型 编辑 Idris 支持对依赖类型 l P displaystyle lambda Pi nbsp 的定义 如下定义了Vec a n displaystyle mbox Vec a n nbsp 即元素类型 a displaystyle a nbsp 的 n displaystyle n nbsp 元组类型 data Nat O S Nat infixr 5 data Vect Type gt Nat gt Type where VNil Vect a O a gt Vect a k gt Vect a S k 嵌入式领域特定语言 EDSL 编辑 Idris 对嵌入式领域特定语言的支持主要包括以下方面 6 编译期间求值 可重载的语法 与C语言库的接口 以及高效的代码生成 类型提供器 Type Provider 编辑 Idris 拥有与 F 相似的类型提供器 它允许编译器在编译期间根据所执行代码的需求而生成新的类型信息 这使得静态类型系统更具可扩展性 7 示例 编辑语法 编辑 Idris 的语法与 Haskell 有许多相似之处 一个最简单的 Hello World 程序如下 module Main main IO main putStrLn Hello World 该程序与 Haskell 的等效写法仅有两点不同 类型签名使用单个冒号 而不是双冒号 开头的模块声明中不必使用 where 从句 Idris 亦支持 where 从句 let 表达式 with 规则 简单的 case 表达式和模式匹配等 依赖类型 编辑 一个在 Idris 中使用依赖类型的示例 total append Vect n a gt Vect m a gt Vect n m a append Nil ys ys append x xs ys x append xs ys 该函数将一个包含 m 个类型 a 的元素的 vector 连接到一个包含 n 个类型 a 的元素的 vector 之后 由于输入 vector 的确切类型依赖于它的值 故在编译 类型检查 时即可保证输出的 vector 必将包含 n m 个类型 a 的元素 关键字 total 将会执行函数的完整性 totality 检查 若函数定义未涵盖所有可能的情形 partial function 则检查器会报错 另一个使用依赖类型的示例 total pairAdd Num a gt Vect n a gt Vect n a gt Vect n a pairAdd Nil Nil Nil pairAdd x xs y ys x y pairAdd xs ys Num a 标志着类型 a 属于 Type class 英语 Type class Num 注意在这里 该函数被认为是完整的 total 尽管并未定义一个参数是 Nil 而另一个参数非 Nil 的模式 原因在于两个作为参数的 vector 只能具备相同的长度 这一点通过依赖类型系统得到了保证 因此在编译时两者长度不同的情形绝无可能发生 这使得该函数定义仍然是完整的 求值策略 编辑 Idris 默认采取及早求值 Eager evaluation 而非 Haskell 的惰性求值 Lazy evaluation 方式 Idris 支持使用 Lazy 关键字显式地指定惰性求值 data Lazy Type gt Type where Delay val a gt Lazy a Force Lazy a gt a boolCase Bool gt Lazy a gt Lazy a gt a boolCase True t e t boolCase False t e e 参考文献 编辑 Brady Edwin Index of eb darcs Idris University of St Andrews School of Computer Science 2007 12 12 原始内容存档于2008 03 20 Release 1 3 3 2020年5月23日 2020年5月24日 Release 1 3 3 2020 05 25 原始内容存档于2021 02 04 Idris News 2013 12 24 原始内容存档于2013 12 24 Idris FAQ 2013 12 24 原始内容存档于2012 03 11 Slides from Systems Programming with Dependent Types at DTP11 PDF 永久失效連結 Christiansen David Dependent type providers PDF 2013 2014 08 26 原始内容 PDF 存档于2017 08 09 外部链接 编辑The Idris homepage 页面存档备份 存于互联网档案馆 including documentation frequently asked questions and examples Idris at the Hackage repository 页面存档备份 存于互联网档案馆 Idris Tutorial 取自 https zh wikipedia org w index php title Idris amp oldid 74527300, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。