summaryrefslogtreecommitdiff
path: root/miralib/manual/8
blob: 8909b5c79dfd783fdeae294c87f30da90b17b820 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
_O_p_e_r_a_t_o_r_s_ _a_n_d_ _t_h_e_i_r_ _b_i_n_d_i_n_g_ _p_o_w_e_r_s

Here is a list of all prefix and infix operators, in order of increasing
binding power.  Operators given on the same line are of the same binding
power.  Prefix operators are identified as such in the  comments  -  all
others are infix.

 operator 			comments

 : ++ -- 			right associative
 \/ 				associative
 & 				associative
 ~ 				prefix
 > >= = ~= <= < 		continued relations allowed, eg 0<x<=10
 + - 				left associative
 - 				prefix
 * / _d_i_v _m_o_d 			left associative
 ^ 				right associative
 .  				associative
 # 				prefix
 !  				left associative
 $identifier $IDENTIFIER	right associative

Brief explanation of each operator:
:	prefix an element to a list, type *->[*]->[*]
++ --   list concatenation, list subtraction, both of type [*]->[*]->[*]
        A formal definition of list subtraction is given below.
\/  &   logical `or', `and', both of type bool->bool->bool
~       logical negation, type bool->bool
> >= = ~= <= <
	comparison operators, all of type *->*->bool
	Note that there is an ordering defined on every (non-function)
	type.  In the case of numbers, characters and strings the order
	is as you would expect, on other types it as an arbitrary but
	reproducible ordering.  Equality on structured data is a test 
	for isomorphism.  (i.e. in LISP terms it is "EQUAL" not "EQ").
	It is an error to test functions for equality or order.
+ -     plus, minus, type num->num->num
-       unary minus, type num->num
	Note that in Miranda unary minus binds less tightly than
	the multiplication and division operators.  This is the
	usual algebraic convention, but is different from PASCAL.
* / _d_i_v _m_o_d
	times, divide, integer divide, integer remainder, 
	all of type num->num->num
	`/' can be applied to integers or fractional numbers, and
	always gives a fractional result, so eg 6/2 is 3.0
	_d_i_v and _m_o_d can only be applied to integers and
	give integer results, eg 7 div 2 is 3, 7 mod 2 is 1.
	_d_i_v and _m_o_d obey the following laws, for a b any integers
	with b ~= 0
	(i)  b * (a _d_i_v b) + a _m_o_d b  =  a
	(ii) if b>0 then 0 <= a _m_o_d b < b
	     if b<0 then b < a _m_o_d b <= 0
^       `to the power of', type num->num->num
.       function composition, type (**->***)->(*->**)->*->***
#       length of list, type [*]->num
!       list subscripting, type [*]->num->*
        note that the first element of a non-empty list x is x!0 and the
	last element is x!(#x-1)
$identifier $IDENTIFIER
	do-it-yourself infix, `a $f b' is equivalent in all contexts to
	`f a b'.  Also works for constructors of two or more arguments.

_N_o_t_e_ _o_n_ _l_i_s_t_ _s_u_b_t_r_a_c_t_i_o_n
 Here is a formal definition of the `--' operator  in  Miranda.   It  is
defined  using  an  auxiliary  function `remove' which removes the first
occurrence (if any) of a given item from a list.

	x -- [] = x
	x -- (b:y) = (remove b x) -- y
	remove b [] = []
	remove b (a:x) = x,            if a=b
		       = a:remove b x, otherwise