![]() | |
| パラダイム | 遅延、関数、宣言型 |
|---|---|
| デザイン: | デビッド・ターナー |
| 開発者 | リサーチソフトウェア株式会社 |
| 初登場 | 1985年 |
| 安定版リリース | 2.066 [1]
/ 2020年1月31日 |
| タイピングの規律 | 強い、静的 |
| ライセンス | 2条項BSDライセンス[2] |
| Webサイト | miranda.org.uk |
| 主な実装 | |
| ミランダ | |
| 影響を受けた | |
| KRC、ML、SASL、ホープ | |
| 影響を受けた | |
| Clean、Haskell、Orwell、Microsoft Power Fx | |
Mirandaは、David Turnerが、以前のプログラミング言語であるSASLとKRCの後継として、 MLとHopeの概念を取り入れて設計した、遅延評価型の純粋関数型 プログラミング言語です。イギリスのResearch Software Ltd.( Mirandaという商標を保有)[3]によって開発され、商業的にサポートされた最初の純粋関数型言語でした。[要出典]
ミランダは1985年にUnix系オペレーティングシステム用のC言語の高速インタープリタとして初めてリリースされ、その後1987年と1989年にリリースされました。これは後のHaskell言語に大きな影響を与えました。[4]ターナーは、Haskellに対するミランダの利点は「より小さな言語、より単純な型システム、より単純な演算」であると述べています。[5]
2020年にMirandaのバージョンがBSDライセンスの下でオープンソースとしてリリースされました。コードは最新のC標準(C11 / C18 )に準拠し、64ビットバイナリを生成するように更新されました。これはDebian、Ubuntu、WSL /Ubuntu、macOS(Catalina )などのオペレーティングシステムでテストされています。[5] [6]
名前

ミランダという名前は、ラテン語の動詞mirorの動名詞形[7]から取られ、「賞賛される」という意味です。
このロゴには、ジョン・ウィリアム・ウォーターハウスによるシェイクスピアの『テンペスト』の登場人物ミランダの描写が描かれています。
概要
Miranda は遅延評価型の純粋関数型プログラミング言語です。つまり、副作用や命令型プログラミング機能がありません。Miranda プログラム (スクリプトと呼ばれる) は、さまざまな数学関数と代数データ型を定義する方程式のセットです。ここではセットという言葉が重要です。方程式の順序は一般に無関係であり、使用前にエンティティを定義する必要はありません。
解析アルゴリズムはレイアウト (オフサイドルールによるインデント) をインテリジェントに使用するため、括弧で囲んだステートメントはほとんど必要なく、ステートメントのターミネータも不要です。ISWIMにヒントを得たこの機能は、 occamやHaskellでも使用されており、後にPythonによって普及しました。
コメントは、文字によって通常のスクリプトに導入され||、同じ行の終わりまで続きます。別のコメント規則は、ソース コード ファイル全体に影響し、「文芸スクリプト」と呼ばれ、記号で始まっていない限り、すべての行がコメントと見なされます>。
Miranda の基本的なデータ型は、、charおよびnumですbool。文字列は単に のリストですがchar、 は、デフォルトで任意精度の整数 (別名 bignum) になり、必要に応じて通常の浮動小数点値になる、
num2 つの基本形式間で自動的に変換されます。
タプルは、潜在的に混合型の要素のシーケンスであり、Pascalのような言語のレコードに似ており、括弧で区切られて記述されます。
this_employee = ( "Folland, Mary" , 10560 , False , 35 )
代わりに、リストはMiranda で最も一般的に使用されるデータ構造です。リストは角括弧で区切られ、要素はコンマで区切られて記述されます。要素はすべて同じ型である必要があります。
week_days = [ "月" 、"火" 、"水" 、"木" 、"金" ]
リストの連結は++、減算は--、構築は:、サイズ指定は#、インデックス付けは なので!、次のようになります。
days = week_days ++ [ "Sat" , "Sun" ] days = "Nil" : days days ! 0 ⇒ "Nil" days = days -- [ "Nil" ] # days ⇒ 7
リスト構築のショートカットはいくつかあります: は..、要素が等差級数を形成し、1 以外の増分を指定できるリストに使用されます:
fac n =積[ 1 .. n ] odd_sum =合計[ 1 , 3 .. 100 ]
より一般的で強力なリスト構築機能は、「リスト内包表記」(以前は「ZF 式」と呼ばれていました)によって提供されます。これには、一連の用語に適用される式という 2 つの主な形式があります。例:
正方形= [ n * n | n <- [ 1 .. ] ]
(これは、n の 2 乗のリスト (n はすべての正の整数のリストから取得されます) と、各項が前の項の関数であるシリーズです。例:
2のべき乗= [ n | n <- 1 , 2 * n .. ]
これら 2 つの例が示すように、Miranda では無限の数の要素を持つリストが許可されており、その中で最も単純なのはすべての正の整数のリストです。[1..]
関数適用の表記は、 のように単純に並べたものですsin x。
Miranda では、他のほとんどの純粋関数型言語と同様に、関数は第一級オブジェクトです。つまり、関数は他の関数に引数として渡したり、結果として返したり、データ構造の要素として含めたりすることができます。さらに、2 つ以上のパラメータを持つ関数は、パラメータの総数よりも少ない引数を提供することで、「部分的にパラメータ化」またはカリー化できます。これにより、残りのパラメータが与えられた場合に結果を返す別の関数が作成されます。例:
a b を追加= a + b増分= 1を追加
は、引数に 1 を加算する関数「increment」を作成するための回りくどい方法です。実際には、 はadd 4 72 つのパラメータを持つ関数 を取りadd、それを に適用して4、引数に 4 を加算する 1 つのパラメータを持つ関数を取得し、それを に適用します7。
2 つのパラメータ (オペランド) を持つ任意の関数は、中置演算子に変換できます (たとえば、add上記の関数の定義では、 項は演算子$addとまったく同じです+)。また、2 つのパラメータを取るすべての中置演算子は、対応する関数に変換できます。つまり、
増分= ( + ) 1
は、引数に1を加算する関数を作成する最も簡単な方法です。同様に、
半分= ( / 2 )逆数= ( 1 / )
2 つの単一パラメータ関数が生成されます。インタープリタは、除算演算子の 2 つのパラメータのどちらが指定されているかをそれぞれ理解し、それぞれ数値を 2 で割ってその逆数を返す関数を生成します。
Miranda は厳密に型付けされたプログラミング言語ですが、明示的な型宣言を要求しません。関数の型が明示的に宣言されていない場合、インタープリタはパラメータの型と関数内での使用方法から型を推測しますchar。基本型 ( 、、 )に加えて、リスト反転関数のように、パラメータの型が重要でない「何でも」型が含まれます
num。bool
rev [] = [] rev ( a : x ) = rev x ++ [ a ]
これは任意のデータ型のリストに適用でき、明示的な関数型宣言は次のようになります。
改訂:: [ * ] -> [ * ]
最後に、モジュールを呼び出すプログラムからは内部関数が見えない プログラムモジュールを作成および管理するためのメカニズムがあります。
サンプルコード
次のミランダスクリプトは、数値の集合のすべての部分集合の集合を決定します。
サブセット[] = [ [] ]サブセット( x : xs ) = [[ x ] ++ y | y <- ys ] ++ ysただしys =サブセットxs
primes
これはすべての素数のリストを返す
関数の文芸スクリプトです
> || すべての素数の無限リスト。
潜在的な素数のリストは、2 以上のすべての整数から始まります。
各素数が返されるたびに、次のすべての数は正確に
それによって割られた値は候補リストから除外されます。
> 素数 = ふるい [2..]
> ふるい (p:x) = p : ふるい [n | n <- x; n mod p ~= 0]
ここにさらにいくつかの例があります
max2 :: num -> num -> num max2 a b = a 、a > b = bの場合、それ以外の場合
max3 :: num -> num -> num -> num max3 a b c = max2 ( max2 a b ) ( max2 a c )
乗算:: num -> num -> num 0を乗算b = 0 a を乗算b = b + ( ( a - 1 ) bを乗算)
fak :: num -> num fak 0 = 1 fak n = n * fak ( n - 1 )
アイテム番号:: [ * ] -> num
アイテム番号[] = 0アイテム番号( a : x ) = 1 +アイテム番号x
平日::=月|トゥ|私たち|こ|神父|さ|スー
isWorkDay :: weekday -> bool isWorkDay Sa = False isWorkDay Su = False isWorkDay anyday = True
ツリー* ::= E | N (ツリー* ) * (ツリー* )
ノード数:: tree * -> numノード数E = 0ノード数( N l w r ) =ノード数l + 1 +ノード数r
空カウント:: tree * -> num空カウントE = 1空カウント( N l w r ) =空カウントl +空カウントr
ツリー例= N ( N ( N E 1 E ) 3 ( N E 4 E )) 5 ( N ( N E 6 E ) 8 ( N E 9 E ))平日ツリー= 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 、x < w の場合= insert x r 、それ以外の場合
list2searchtree :: [ * ] -> tree * list2searchtree [] = E list2searchtree [ x ] = N E x E list2searchtree ( x : xs ) = insert x ( list2searchtree xs )
maxel :: tree * -> * maxel E = error "空" maxel ( N l w E ) = w maxel ( N l w r ) = maxel r
minel :: tree * -> * minel E = error "空" minel ( N E w r ) = w minel ( N l w r ) = minel l
||トラバース:ツリーの値をたどってリストに格納する
preorder 、inorder 、postorder :: tree * -> [ * ] inorder E = [] inorder N l w r = inorder l ++ [ w ] ++ inorder r
事前順序E = []事前順序N l w r = [ w ] ++事前順序l ++事前順序r
事後順序E = []事後順序N l w r =事後順序l ++事後順序r ++ [ w ]
高さ:: tree * -> num height E = 0 height ( N l w r ) = 1 + max2 ( height l ) ( height r )
amount :: num -> num amount x = x 、x >= 0の場合amount x = x * ( - 1 )、それ以外の場合
:: bool - > bool -> boolかつTrue True = Trueかつx y = False
|| AVL -ツリーは、子ノード間の差が1を超えないツリーです||まだこれをテストする必要があります
isAvl :: tree * -> bool isAvl E = True isAvl ( N l w r ) =かつ( isAvl l ) ( isAvl r )、amount (( nodecount l ) - ( nodecount r )) < 2の場合= False 、それ以外の場合
削除:: * -> tree * -> tree *削除x E = E削除x ( N E x E ) = E削除x ( N E x r ) = N E ( minel r ) (削除( minel r ) r )削除x ( N l x r ) = N (削除( maxel l ) l ) ( maxel l ) r削除x ( N l w r ) = N (削除x l ) w (削除x r )
参考文献
- ^ 「Mirandaダウンロードページ」 。 2024年5月17日閲覧。
- ^ 「miranda: COPYING」 . 2024年5月17日閲覧。
- ^ Turner, DA (1985 年 9 月)。「Miranda: 多態型を持つ非厳密な関数型言語」(PDF)。Jouannaud, Jean-Pierre (編)。関数型プログラミング言語とコンピュータ アーキテクチャ。コンピュータ サイエンスの講義ノート。第 201 巻。ベルリン、ハイデルベルク: 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). 「Haskell の歴史: クラスを怠けよう」。プログラミング言語の歴史に関する第 3 回 ACM SIGPLAN 会議の議事録。ニューヨーク、ニューヨーク、米国: ACM。doi : 10.1145 / 1238844.1238856。ISBN 9781595937667. S2CID 52847907。
- ^ ab Turner, David (2021-03-22). 「Open Sourcing Miranda」. Code Sync . ロンドン (2020年11月発行) . 2021年12月30日閲覧。
- ^ 「Miranda ダウンロード ページ」。www.cs.kent.ac.uk 。2021年 12 月 30 日閲覧。
- ^ 「ミランダという名前について」。2024年5月18日閲覧。
外部リンク
- 公式サイト

