Miranda语言

Miranda，是一种惰性求值的纯函数式编程语言，由英国学者所设计。采用来自ML与Hope语言的概念，他用此来作为他先前所设计的SASL与KRC语言的后继者。这个程式语言由英国的研究软体公司出品，这间公司拥有这个程式语言的商标权。
Miranda在1985年首次发表以C语言写成的直译器，能够在类UNIX系统上运作。随后在1987年与1989年发行了更新版。Miranda强烈的影响了后来发展出的Haskell语言。
概述.
Miranda是惰性、纯函数式编程语言。就是说，它缺少副作用和指令式编程特征。一个Miranda程序（叫做脚本）定义数学函数和代数数据类型的一组等式。集合的概念在这里是重要的，即等式的次序一般而言是无关紧要的，并且不需要在使用之前定义一个实体。
词法.
因为解析算法可以智能的利用布局（缩进），很少需要将语句用括号包围起来，并且不要求语句终止符。这个特征受到了ISWIM的启发，也被用于occam和Haskell中，后来经由Python而流行起来。
注释通过字符codice_1介入到正规的脚本中并持续到此行结束。一种可作为替代的注释约定影响整个源代码文件，叫做“文学脚本”，在其中所有的行都被当作注释，除非它开始于codice_2符号。
数据类型.
Miranda的基本数据类型是codice_3、codice_4和codice_5。字符串简单的就是codice_3的列表，而codice_4在两种底层形式之间静默转换：缺省的任意精度整数（又名bignum），和需要时的正规浮点值。
元组是潜在混合类型的元素的序列，类似于类Pascal语言的记录，用圆括号来界定：
<syntaxhighlight lang="haskell">
this_employee = ("Folland, Mary", 10560, False, 35)
</syntaxhighlight>
列表是Miranda中最常用的数据结构。列表用方括号来界定并具有用逗号分隔的元素，它们都必须有着相同类型：
<syntaxhighlight lang="haskell">
week_days = ["Mon","Tue","Wed","Thur","Fri"]
</syntaxhighlight>
列表串接是codice_8，删减是codice_9，构造是codice_10，大小是codice_11而索引是codice_12，比如：
<syntaxhighlight lang="haskell">
days = week_days ++ ["Sat","Sun"]
days = "Nil":days
days!0
⇒ "Nil"
days = days -- ["Nil"]
⇒ 7
</syntaxhighlight>
有一些列表建造捷径：codice_13用于其元素形成算数序列的列表，具有指定不是1的增量的可能：
<syntaxhighlight lang="haskell">
fac n = product [1..n]
odd_sum = sum [1,3..100]
</syntaxhighlight>
更一般性和更强力的列表建造设施是列表推导式（以前叫做“ZF表达式”)，它以两种主要形式提供：应用于一系列项目的一个表达式，比如：
<syntaxhighlight lang="haskell">
squares = [ n * n | n <- 
</syntaxhighlight>
它可以读作：codice_14的平方的列表，这里的codice_14取自所有正数的列表；和其中每个项目都是前一项目的函数的一个系列，比如：
<syntaxhighlight lang="haskell">
powers_of_2 = [ n | n <- 1, 2*n .. ]
</syntaxhighlight>
如这两个例子所蕴含的那样，Miranda允许无限数目元素的列表，其中最简单的是所有正数的列表：codice_16。
函数.
函数应用的表示法是简单的并列，比如codice_17这样。
在Miranda中，如同大多数其他纯函数式语言，函数是头等公民，就是说它们可以作为实际参数传递给其他函数，作为结果返回，被包括为数据结构的元素。进一步的，通过提供少于形式参数数目的实际参数，有两个或更多形式参数的函数可以部份的“参数化”，或柯里化。这给出了另一个函数，接受余下的形式参数，并返回一个结果。例如：
<syntaxhighlight lang="haskell">
add a b = a + b
increment = add 1
</syntaxhighlight>
是建立向它的实际参数加codice_18的一个函数“增加”的迂回方式。在现实中，codice_19接受两个形式参数，函数codice_20应用于codice_21将得到一个单一形式参数的函数，它向它的实际参数加codice_21，接着应用它于codice_23得到结果codice_24。
任何有两个形式参数（操作数）的函数都可以转变成中缀算符，例如，给出上述的codice_20函数定义，项目codice_26在所有方式下都等价于codice_27算符，而所有接受两个形式参数的中缀算符也可以转变成对应的函数。因此如下这样：
<syntaxhighlight lang="haskell">
increment = (+) 1
</syntaxhighlight>
是建立向其实际参数加codice_18的最简洁方式。类似的，在下列中：
<syntaxhighlight lang="haskell">
half = (/ 2)
reciprocal = (1 /)
</syntaxhighlight>
生成了两个单一形式参数的函数。解释器理解提供除法算符的两个形式参数的每种情况，分别给出将一个数除以codice_29和返回它的倒数的函数。
它有着建立和操纵程序模块的机制，其内部函数对于调用这些模块的程序是不可见的。
类型推论和多态.
尽管Miranda是强类型编程语言，它不坚持于显式的类型。如果一个函数的类型没有明确的声明，解释器会从它的形式参数和它们在函数内如何使用来推论出它的类型。除了基本类型（codice_3、codice_4和codice_5）之外，它包括了“任何事物”类型，这里一个形式参数的类型是无关紧要的，例如在列表反转函数中：
<syntaxhighlight lang="haskell">
rev [] = []
rev (a:x) = rev x ++ 
</syntaxhighlight>
它可以应用于有任何数据类型的列表，给它的显式的函数类型声明将是：
<syntaxhighlight lang="haskell">
rev :: [*] -> [*]
</syntaxhighlight>
样例代码.
下列的Miranda脚本确定一个数的集合的所有子集的集合：
<syntaxhighlight lang="haskell">
subsets [] = 
subsets (x:xs) = [++ y | y <- ys ++ ys
</syntaxhighlight>
和函数codice_33的文学脚本，它给出所有素数的列表：
<syntaxhighlight lang="doscon">
> || 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 <- x; n mod p ~= 0
</syntaxhighlight>