fbpx
Wikipedia

Miranda (programming language)

Miranda is a lazy, purely functional programming language designed by David Turner as a successor to his earlier programming languages SASL and KRC, using some concepts from ML and Hope. It was produced by Research Software Ltd. of England (which holds a trademark on the name Miranda)[3] and was the first purely functional language to be commercially supported.[citation needed]

Miranda
Paradigmlazy, functional, declarative
Designed byDavid Turner
DeveloperResearch Software Ltd
First appeared1985; 39 years ago (1985)
Stable release
2.066[1]  / 31 January 2020; 4 years ago (31 January 2020)
Typing disciplinestrong, static
License2-clause BSD License[2] 
Websitemiranda.org.uk
Major implementations
Miranda
Influenced by
KRC, ML, SASL, Hope
Influenced
Clean, Haskell, Orwell, Microsoft Power Fx

Miranda was first released in 1985 as a fast interpreter in C for Unix-flavour operating systems, with subsequent releases in 1987 and 1989. It had a strong influence on the later Haskell language.[4] Turner stated that the benefits of Miranda over Haskell are: "Smaller language, simpler type system, simpler arithmetic".[5]

In 2020 a version of Miranda was released as open source under a BSD licence. The code has been updated to conform to modern C standards (C11/C18) and to generate 64-bit binaries. This has been tested on operating systems including Debian, Ubuntu, WSL/Ubuntu, and macOS (Catalina).[5][6]

Name edit

 
Miranda by John William Waterhouse, 1917

The name Miranda is taken from the gerundive form of the latin verb miror,[7] meaning "to be admired."

The logo features a rendition by John William Waterhouse of the character Miranda from Shakespeare's The Tempest.

Overview edit

Miranda is a lazy, purely functional programming language. That is, it lacks side effects and imperative programming features. A Miranda program (called a script) is a set of equations that define various mathematical functions and algebraic data types. The word set is important here: the order of the equations is, in general, irrelevant, and there is no need to define an entity prior to its use.

Since the parsing algorithm makes intelligent use of layout (indentation, via off-side rule), bracketing statements are rarely needed and statement terminators are unneeded. This feature, inspired by ISWIM, is also used in occam and Haskell and was later popularized by Python.

Commentary is introduced into regular scripts by the characters || 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 data types are 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 floating point values as required.

Tuples are sequences of elements of potentially mixed types, analogous to records in Pascal-like languages, and are written delimited with parentheses:

 this_employee = ("Folland, Mary", 10560, False, 35) 

The list instead is the most commonly used data structure in Miranda. It is written delimited by square brackets and with comma-separated elements, all of which must be of the same type:

 week_days = ["Mon","Tue","Wed","Thur","Fri"] 

List concatenation is ++, subtraction is --, construction is :, sizing is # and indexing is !, so:

 days = week_days ++ ["Sat","Sun"]  days = "Nil":days  days!0   "Nil"  days = days -- ["Nil"]  #days   7 

There are several list-building shortcuts: .. is used for lists whose elements form an arithmetic series, with the possibility for specifying an increment other than 1:

 fac n = product [1..n]  odd_sum = sum [1,3..100] 

More general and powerful list-building facilities are provided by "list comprehensions" (previously known as "ZF expressions"), which come in two main forms: an expression applied to a series of terms, e.g.:

 squares = [ n * n | n <- [1..] ] 

(which is read: list of n squared where n is taken from the list of all positive integers) and a series where each term is a function of the previous one, e.g.:

 powers_of_2 = [ n | n <- 1, 2*n .. ] 

As these two examples imply, Miranda allows for lists with an infinite number of elements, of which the simplest is the list of all positive integers: [1..]

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 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 infers 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 edit

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 [2..] > sieve (p:x) = p : sieve [n | 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 <w   = insert x r , otherwise list2searchtree :: [*] -> 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 edit

  1. ^ "Miranda download page". Retrieved 17 May 2024.
  2. ^ "miranda: COPYING". Retrieved 17 May 2024.
  3. ^ Turner, D. A. (September 1985). "Miranda: A non-strict functional language with polymorphic types" (PDF). In Jouannaud, Jean-Pierre (ed.). Functional Programming Languages and Computer Architecture. Lecture Notes in Computer Science. Vol. 201. Berlin, Heidelberg: Springer. pp. 1–16. doi:10.1007/3-540-15975-4_26. ISBN 978-3-540-39677-2.
  4. ^ Hudak, Paul; Hughes, John; Peyton Jones, Simon; Wadler, Philip (2007-06-09). "A history of Haskell: Being lazy with class". Proceedings of the third ACM SIGPLAN conference on History of programming languages. New York, NY, USA: ACM. doi:10.1145/1238844.1238856. ISBN 9781595937667. S2CID 52847907.
  5. ^ a b Turner, David (2021-03-22). "Open Sourcing Miranda". Code Sync. London (published November 2020). Retrieved 2021-12-30.
  6. ^ "Miranda download page". www.cs.kent.ac.uk. Retrieved 2021-12-30.
  7. ^ "About the name Miranda". Retrieved 2024-05-18.

External links edit

  • Official website  

miranda, programming, language, this, article, includes, list, general, references, lacks, sufficient, corresponding, inline, citations, please, help, improve, this, article, introducing, more, precise, citations, september, 2016, learn, when, remove, this, me. This article includes a list of general references but it lacks sufficient corresponding inline citations Please help to improve this article by introducing more precise citations September 2016 Learn how and when to remove this message Miranda is a lazy purely functional programming language designed by David Turner as a successor to his earlier programming languages SASL and KRC using some concepts from ML and Hope It was produced by Research Software Ltd of England which holds a trademark on the name Miranda 3 and was the first purely functional language to be commercially supported citation needed MirandaParadigmlazy functional declarativeDesigned byDavid TurnerDeveloperResearch Software LtdFirst appeared1985 39 years ago 1985 Stable release2 066 1 31 January 2020 4 years ago 31 January 2020 Typing disciplinestrong staticLicense2 clause BSD License 2 Websitemiranda wbr org wbr ukMajor implementationsMirandaInfluenced byKRC ML SASL HopeInfluencedClean Haskell Orwell Microsoft Power Fx Miranda was first released in 1985 as a fast interpreter in C for Unix flavour operating systems with subsequent releases in 1987 and 1989 It had a strong influence on the later Haskell language 4 Turner stated that the benefits of Miranda over Haskell are Smaller language simpler type system simpler arithmetic 5 In 2020 a version of Miranda was released as open source under a BSD licence The code has been updated to conform to modern C standards C11 C18 and to generate 64 bit binaries This has been tested on operating systems including Debian Ubuntu WSL Ubuntu and macOS Catalina 5 6 Contents 1 Name 2 Overview 3 Sample code 4 References 5 External linksName edit nbsp Miranda by John William Waterhouse 1917 The name Miranda is taken from the gerundive form of the latin verb miror 7 meaning to be admired The logo features a rendition by John William Waterhouse of the character Miranda from Shakespeare s The Tempest Overview editMiranda is a lazy purely functional programming language That is it lacks side effects and imperative programming features A Miranda program called a script is a set of equations that define various mathematical functions and algebraic data types The word set is important here the order of the equations is in general irrelevant and there is no need to define an entity prior to its use Since the parsing algorithm makes intelligent use of layout indentation via off side rule bracketing statements are rarely needed and statement terminators are unneeded This feature inspired by ISWIM is also used in occam and Haskell and was later popularized by Python Commentary is introduced into regular scripts by the characters 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 gt sign Miranda s basic data types are 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 floating point values as required Tuples are sequences of elements of potentially mixed types analogous to records in Pascal like languages and are written delimited with parentheses this employee Folland Mary 10560 False 35 The list instead is the most commonly used data structure in Miranda It is written delimited by square brackets and with comma separated elements all of which must be of the same type week days Mon Tue Wed Thur Fri List concatenation is subtraction is construction is sizing is and indexing is so days week days Sat Sun days Nil days days 0 Nil days days Nil days 7 There are several list building shortcuts is used for lists whose elements form an arithmetic series with the possibility for specifying an increment other than 1 fac n product 1 n odd sum sum 1 3 100 More general and powerful list building facilities are provided by list comprehensions previously known as ZF expressions which come in two main forms an expression applied to a series of terms e g squares n n n lt 1 which is read list of n squared where n is taken from the list of all positive integers and a series where each term is a function of the previous one e g powers of 2 n n lt 1 2 n As these two examples imply Miranda allows for lists with an infinite number of elements of which the simplest is the list of all positive integers 1 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 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 infers 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 gt Finally it has mechanisms for creating and managing program modules whose internal functions are invisible to programs calling those modules Sample code editThe following Miranda script determines the set of all subsets of a set of numbers subsets subsets x xs x y y lt ys ys where ys subsets xs and this is a literate script for a function primes which gives the list of all prime numbers gt 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 gt primes sieve 2 gt sieve p x p sieve n n lt x n mod p 0 Here we have some more examples max2 num gt num gt num max2 a b a if a gt b b otherwise max3 num gt num gt num gt num max3 a b c max2 max2 a b max2 a c multiply num gt num gt num multiply 0 b 0 multiply a b b multiply a 1 b fak num gt num fak 0 1 fak n n fak n 1 itemnumber gt num itemnumber 0 itemnumber a x 1 itemnumber x weekday Mo Tu We Th Fr Sa Su isWorkDay weekday gt bool isWorkDay Sa False isWorkDay Su False isWorkDay anyday True tree E N tree tree nodecount tree gt num nodecount E 0 nodecount N l w r nodecount l 1 nodecount r emptycount tree gt 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 gt stree gt 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 lt w insert x r otherwise list2searchtree gt tree list2searchtree E list2searchtree x N E x E list2searchtree x xs insert x list2searchtree xs maxel tree gt maxel E error empty maxel N l w E w maxel N l w r maxel r minel tree gt 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 gt 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 gt num height E 0 height N l w r 1 max2 height l height r amount num gt num amount x x if x gt 0 amount x x 1 otherwise and bool gt bool gt 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 gt bool isAvl E True isAvl N l w r and isAvl l isAvl r if amount nodecount l nodecount r lt 2 False otherwise delete gt tree gt 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 edit Miranda download page Retrieved 17 May 2024 miranda COPYING Retrieved 17 May 2024 Turner D A September 1985 Miranda A non strict functional language with polymorphic types PDF In Jouannaud Jean Pierre ed Functional Programming Languages and Computer Architecture Lecture Notes in Computer Science Vol 201 Berlin Heidelberg Springer pp 1 16 doi 10 1007 3 540 15975 4 26 ISBN 978 3 540 39677 2 Hudak Paul Hughes John Peyton Jones Simon Wadler Philip 2007 06 09 A history of Haskell Being lazy with class Proceedings of the third ACM SIGPLAN conference on History of programming languages New York NY USA ACM doi 10 1145 1238844 1238856 ISBN 9781595937667 S2CID 52847907 a b Turner David 2021 03 22 Open Sourcing Miranda Code Sync London published November 2020 Retrieved 2021 12 30 Miranda download page www cs kent ac uk Retrieved 2021 12 30 About the name Miranda Retrieved 2024 05 18 External links editOfficial website nbsp Retrieved from https en wikipedia org w index php title Miranda programming language amp oldid 1226039796, wikipedia, wiki, book, books, library,

article

, read, download, free, free download, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, picture, music, song, movie, book, game, games.