Idris is a
purely-functional programming language
A programming language is a system of notation for writing computer programs.
Programming languages are described in terms of their Syntax (programming languages), syntax (form) and semantics (computer science), semantics (meaning), usually def ...
with
dependent types, optional
lazy evaluation
In programming language theory, lazy evaluation, or call-by-need, is an evaluation strategy which delays the evaluation of an Expression (computer science), expression until its value is needed (non-strict evaluation) and which avoids repeated eva ...
, and features such as a
totality checker. Idris may be used as a
proof assistant, but is designed to be a
general-purpose programming language
In computer software, a general-purpose programming language (GPL) is a programming language for building software in a wide variety of application Domain (software engineering), domains. Conversely, a Domain-specific language, domain-specific pro ...
similar to
Haskell
Haskell () is a general-purpose, statically typed, purely functional programming language with type inference and lazy evaluation. Designed for teaching, research, and industrial applications, Haskell pioneered several programming language ...
.
The Idris
type system
In computer programming, a type system is a logical system comprising a set of rules that assigns a property called a ''type'' (for example, integer, floating point, string) to every '' term'' (a word, phrase, or other set of symbols). Usu ...
is similar to
Agda's, and proofs are similar to
Coq's, including tactics (theorem proving
functions/procedures) via elaborator reflection. Compared to Agda and Coq, Idris prioritizes management of
side effects
In medicine, a side effect is an effect of the use of a medicinal drug or other treatment, usually adverse but sometimes beneficial, that is unintended. Herbal and traditional medicines also have side effects.
A drug or procedure usually used ...
and support for
embedded domain-specific languages. Idris compiles to
C (relying on a custom copying
garbage collector using
Cheney's algorithm) and
JavaScript
JavaScript (), often abbreviated as JS, is a programming language and core technology of the World Wide Web, alongside HTML and CSS. Ninety-nine percent of websites use JavaScript on the client side for webpage behavior.
Web browsers have ...
(both browser- and
Node.js-based). There are third-party code generators for other platforms, including
Java virtual machine
A Java virtual machine (JVM) is a virtual machine that enables a computer to run Java programs as well as programs written in other languages that are also compiled to Java bytecode. The JVM is detailed by a specification that formally descr ...
(JVM),
Common Intermediate Language (CIL), and
LLVM
LLVM, also called LLVM Core, is a target-independent optimizer and code generator. It can be used to develop a Compiler#Front end, frontend for any programming language and a Compiler#Back end, backend for any instruction set architecture. LLVM i ...
.
Idris is named after a singing dragon from the 1970s UK children's television program ''
Ivor the Engine''.
Features
Idris combines a number of features from relatively mainstream functional programming languages with features borrowed from
proof assistants.
Functional programming
The syntax of Idris shows many similarities with that of Haskell. A
hello world program in Idris might look like this:
module Main
main : IO ()
main = putStrLn "Hello, World!"
The only differences between this program and its
Haskell equivalent are the single (instead of double) colon in the
type signature of the main function, and the omission of the word "
where
" in the
module declaration.
Inductive and parametric data types
Idris supports
inductively-defined data types and
parametric polymorphism. Such types can be defined both in traditional ''
Haskell
Haskell () is a general-purpose, statically typed, purely functional programming language with type inference and lazy evaluation. Designed for teaching, research, and industrial applications, Haskell pioneered several programming language ...
98''-like syntax:
data Tree a = Node (Tree a) (Tree a) , Leaf a
or in the more general
generalized algebraic data type
In functional programming, a generalized algebraic data type (GADT, also first-class phantom type, guarded recursive datatype, or equality-qualified type) is a generalization of a Parametric polymorphism, parametric algebraic data type (ADT).
Ove ...
(GADT)-like syntax:
data Tree : Type -> Type where
Node : Tree a -> Tree a -> Tree a
Leaf : a -> Tree a
Dependent types
With
dependent types, it is possible for values to appear in the types; in effect, any value-level computation can be performed during
type checking
In computer programming, a type system is a logical system comprising a set of rules that assigns a property called a ''type'' (for example, integer, floating point, string) to every '' term'' (a word, phrase, or other set of symbols). Usu ...
. The following defines a type of lists whose lengths are known before the program runs, traditionally called
vectors:
data Vect : Nat -> Type -> Type where
Nil : Vect 0 a
(::) : (x : a) -> (xs : Vect n a) -> Vect (n + 1) a
This type can be used as follows:
total
append : Vect n a -> Vect m a -> Vect (n + m) a
append Nil ys = ys
append (x :: xs) ys = x :: append xs ys
The function
append
appends a vector of
m
elements of type
a
to a vector of
n
elements of type
a
. Since the precise types of the input vectors depend on a value, it is possible to be certain at
compile time
In computer science, compile time (or compile-time) describes the time window during which a language's statements are converted into binary instructions for the processor to execute. The term is used as an adjective to describe concepts relat ...
that the resulting vector will have exactly (
n
+
m
) elements of type
a
.
The word "
total
" invokes the
totality checker which will report an error if the function
doesn't cover all possible cases or cannot be (automatically) proven not to enter an
infinite loop.
Another common example is pairwise addition of two vectors that are parameterized over their length:
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 signifies that the type a belongs to the
type class Num
. Note that this function still typechecks successfully as total, even though there is no case matching
Nil
in one vector and a number in the other. Because the type system can prove that the vectors have the same length, we can be sure at compile time that case will not occur and there is no need to include that case in the function’s definition.
Proof assistant features
Dependent types are powerful enough to encode most properties of programs, and an Idris program can prove invariants at compile time. This makes Idris into a proof assistant.
There are two standard ways of interacting with proof assistants: by writing a series of tactic invocations (Coq style), or by interactively elaborating a proof term (
Epigram
An epigram is a brief, interesting, memorable, sometimes surprising or satirical statement. The word derives from the Greek (, "inscription", from [], "to write on, to inscribe"). This literary device has been practiced for over two millennia ...
–Agda style). Idris supports both modes of interaction, although the set of available tactics is not yet as useful as that of Coq.
Code generation
Because Idris contains a proof assistant, Idris programs can be written to pass proofs around. If treated naïvely, such proofs remain around at runtime. Idris aims to avoid this pitfall by aggressively erasing unused terms.
By default, Idris generates native code through
C. The other officially supported backend generates
JavaScript
JavaScript (), often abbreviated as JS, is a programming language and core technology of the World Wide Web, alongside HTML and CSS. Ninety-nine percent of websites use JavaScript on the client side for webpage behavior.
Web browsers have ...
.
Idris 2
Idris 2 is a new
self-hosted version of the language which deeply integrates a
linear type system, based on
quantitative type theory. It currently compiles to
Scheme and
C.
See also
*
List of proof assistants
*
Total functional programming
References
External links
* , documentation, frequently asked questions, examples
Idris at the Hackage repository
{{Programming languages
Dependently typed languages
Experimental programming languages
Functional languages
Free software programmed in Haskell
Haskell programming language family
Articles with example Haskell code
Cross-platform free software
Free and open source compilers
Software using the BSD license
Programming languages created in 2007
High-level programming languages
2007 software
Pattern matching programming languages
Statically typed programming languages