Overview
Miranda is a lazy, purely functional programming language. That is, it lacks, ,
and continue to the end of the same line. An alternative commenting convention affects an entire source code file, known as a " literate script", in which every line is considered a comment unless it starts with a >
sign.
Miranda's basic char
, num
and bool
. A character string is simply a list of char
, while num
is silently converted between two underlying forms: arbitrary-precision integers (a.k.a. bignums) by default, and regular ++
, subtraction is --
, construction is :
, sizing is #
and indexing is !
, so:
..
is used for lists whose elements form an arithmetic series, with the possibility for specifying an increment other than 1:
../code>
The notation for function application is simply juxtaposition, as in sin x
.
In Miranda, as in most other purely functional languages, functions are first-class citizens, which is to say that they can be passed as arguments
An argument is a statement or group of statements called premises intended to determine the degree of truth or acceptability of another statement called conclusion. Arguments can be studied from three main perspectives: the logical, the dialectic ...
to other functions, returned as results, or included as elements of data structures. What is more, a function with two or more parameters may be "partially parameterised", or curried, by supplying fewer arguments than the full number of parameters. This gives another function which, given the remaining parameters, will return a result. For example:
add a b = a + b
increment = add 1
is a roundabout way of creating a function "increment" which adds one to its argument. In reality, add 4 7
takes the two-parameter function add
, applies it to 4
obtaining a single-parameter function that adds four to its argument, then applies that to 7
.
Any function with two parameters (operands) can be turned into an infix operator (for example, given the definition of the add
function above, the term $add
is in every way equivalent to the +
operator) and every infix operator taking two parameters can be turned into a corresponding function.
Thus:
increment = (+) 1
is the briefest way to create a function that adds one to its argument. Similarly, in
half = (/ 2)
reciprocal = (1 /)
two single-parameter functions are generated. The interpreter understands in each case which of the divide operator's two parameters is being supplied, giving functions which respectively divide a number by two and return its reciprocal.
Although Miranda is a strongly typed programming language, it does not insist on explicit type declarations. If a function's type is not explicitly declared, the interpreter infer
Inferences are steps in reasoning, moving from premises to logical consequences; etymologically, the word '' infer'' means to "carry forward". Inference is theoretically traditionally divided into deduction and induction, a distinction that ...
s it from the type of its parameters and how they are used within the function. In addition to the basic types (char
, num
, bool
), it includes an "anything" type where the type of a parameter does not matter, as in the list-reversing function:
rev [] = []
rev (a:x) = rev x ++ [a]
which can be applied to a list of any data type, for which the explicit function type declaration would be:
rev :: ->
Finally, it has mechanisms for creating and managing program modules whose internal functions are invisible to programs calling those modules.
Sample code
The following Miranda script determines the set of all subsets of a set of numbers
subsets [] =
subsets (x:xs) = x] ++ y , y <- ys] ++ ys
where ys = subsets xs
and this is a literate script for a function primes
which gives the list of all prime numbers
> , , The infinite list of all prime numbers.
The list of potential prime numbers starts as all integers from 2 onwards;
as each prime is returned, all the following numbers that can exactly be
divided by it are filtered out of the list of candidates.
> primes = sieve ..> sieve (p:x) = p : sieve n <- x; n mod p ~= 0
Here, we have some more examples
max2 :: num -> num -> num
max2 a b = a, if a>b
= b, otherwise
max3 :: num -> num -> num -> num
max3 a b c = max2 (max2 a b) (max2 a c)
multiply :: num -> num -> num
multiply 0 b = 0
multiply a b = b + (multiply (a-1) b)
fak :: num -> num
fak 0 = 1
fak n = n * (fak n-1)
itemnumber:: >num
itemnumber [] = 0
itemnumber (a:x) = 1 + itemnumber x
weekday::= Mo, Tu, We, Th, Fr, Sa, Su
isWorkDay :: weekday -> bool
isWorkDay Sa = False
isWorkDay Su = False
isWorkDay anyday = True
tree * ::= E, N (tree *) * (tree *)
nodecount :: tree * -> num
nodecount E = 0
nodecount (N l w r) = nodecount l + 1 + nodecount r
emptycount :: tree * -> num
emptycount E = 1
emptycount (N l w r) = emptycount l + emptycount r
treeExample = N ( N (N E 1 E) 3 (N E 4 E)) 5 (N (N E 6 E) 8 (N E 9 E))
weekdayTree = N ( N (N E Mo E) Tu (N E We E)) Th (N (N E Fr E) Sa (N E Su))
insert :: * -> stree * -> stree *
insert x E = N E x E
insert x (N l w E) = N l w x
insert x (N E w r) = N x w r
insert x (N l w r) = insert x l , if x -> tree *
list2searchtree [] = E
list2searchtree [x] = N E x E
list2searchtree (x:xs) = insert x (list2searchtree xs)
maxel :: tree * -> *
maxel E = error "empty"
maxel (N l w E) = w
maxel (N l w r) = maxel r
minel :: tree * -> *
minel E = error "empty"
minel (N E w r) = w
minel (N l w r) = minel l
, , Traversing: going through values of tree, putting them in list
preorder,inorder,postorder :: tree * -> inorder E = []
inorder N l w r = inorder l ++ [w] ++ inorder r
preorder E = []
preorder N l w r = [w] ++ preorder l ++ preorder r
postorder E = []
postorder N l w r = postorder l ++ postorder r ++ [w]
height :: tree * -> num
height E = 0
height (N l w r) = 1 + max2 (height l) (height r)
amount :: num -> num
amount x = x ,if x >= 0
amount x = x*(-1), otherwise
and :: bool -> bool -> bool
and True True = True
and x y = False
, , A AVL-Tree is a tree where the difference between the child nodes is not higher than 1
, , i still have to test this
isAvl :: tree * -> bool
isAvl E = True
isAvl (N l w r) = and (isAvl l) (isAvl r), if amount ((nodecount l) - (nodecount r)) < 2
= False, otherwise
delete :: * -> tree * -> tree *
delete x E = E
delete x (N E x E) = E
delete x (N E x r) = N E (minel r) (delete (minel r) r)
delete x (N l x r) = N (delete (maxel l) l) (maxel l) r
delete x (N l w r) = N (delete x l) w (delete x r)
References
External links
*
{{Authority control
Declarative programming languages
Functional languages
History of computing in the United Kingdom