맨위로가기

미란다 (프로그래밍 언어)

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

미란다는 느긋한 계산을 사용하는 순수 함수형 프로그래밍 언어이다. 부작용이 없고 명령형 프로그래밍 기능이 없으며, 다양한 수학적 함수와 대수적 자료형을 정의하는 일련의 방정식으로 구성된 프로그램을 사용한다. 파싱 알고리즘은 레이아웃을 사용하여 괄호와 문장 종결자를 거의 필요로 하지 않으며, 주석은 `||`로 시작한다. 미란다는 `char`, `num`, `bool`과 같은 기본 자료형, 튜플, 리스트 등을 지원하며, 리스트 컴프리헨션을 통해 보다 강력한 리스트 구축 기능을 제공한다. 함수는 일급 시민이며, 커링이 가능하다. 강력한 형식 언어이지만 명시적인 형식 선언을 고집하지 않으며, 모듈을 생성하고 관리하는 메커니즘을 갖추고 있다.

더 읽어볼만한 페이지

  • 선언형 프로그래밍 언어 - XAML
    XAML은 마이크로소프트에서 개발한 XML 기반의 마크업 언어로, 사용자 인터페이스, 데이터 바인딩, 이벤트 처리 등을 정의하며 WPF, Silverlight, WF, WinRT API 앱, Xamarin.Forms 등에서 UI 개발에 널리 사용된다.
  • 선언형 프로그래밍 언어 - 임베디드 SQL
    임베디드 SQL은 호스트 프로그래밍 언어 내에 SQL 문을 삽입하여 데이터베이스와 상호 작용하는 기술로, 데이터베이스 액세스를 표준화하지만 보안 취약점과 이식성 저하의 단점도 가진다.
  • 함수형 프로그래밍 언어 - XQuery
    XQuery는 함수형 프로그래밍 패러다임을 지원하며 XPath 식 구문의 상위 집합을 포함하는 XML 데이터 추출 및 조작을 위한 쿼리 언어로서, FLWOR 식을 통해 XML 데이터 조작 및 새로운 XML 문서 구성을 지원하고 XQuery 및 XPath 데이터 모델(XDM)을 기반으로 한다.
  • 함수형 프로그래밍 언어 - 코틀린 (프로그래밍 언어)
    코틀린은 젯브레인즈에서 개발한 정적 타입 언어로, 자바 가상 머신에서 동작하며 자바와의 호환성을 갖고, 안드로이드 공식 지원 언어로 채택되어 다양한 분야에서 활용되고 있으며, 이름은 러시아의 코틀린 섬에서 유래되었다.
미란다 (프로그래밍 언어) - [IT 관련 정보]에 관한 문서
프로그래밍 언어 정보
이름미란다
미란다 로고 (프로그래밍 언어)
프로그래밍 패러다임느긋한
함수형
선언형
발표 시기1985년
설계자데이비드 터너
개발자Research Software Ltd
타이핑강한
정적
구현체미란다
영향을 준 언어KRC
ML
SASL
Hope
영향을 받은 언어Clean
하스켈
Orwell
Microsoft Power Fx
웹사이트miranda.org.uk

2. 이름

존 윌리엄 워터하우스의 ''미란다'', 1917


'''미란다'''라는 이름은 라틴어 동사 miror|미로르la의 게룬디브 형태에서 유래되었으며,[5] "존경받다"라는 뜻을 가진다.

로고는 셰익스피어의 희곡 ''템페스트''에 나오는 등장인물 미란다를 존 윌리엄 워터하우스가 묘사한 것이다.

3. 특징

미란다는 느긋한 계산법을 사용하는 순수 함수형 프로그래밍 언어이다.[6] 즉, 부작용이 없고 명령형 프로그래밍 기능이 없다.[6]

미란다의 주요 특징은 다음과 같다:


  • 정적 타입 시스템: 강력한 형식 언어이지만, 명시적인 타입 선언을 강제하지 않는다.[6] 컴파일러가 형식 추론을 통해 타입을 결정한다.[6]
  • 오프사이드 규칙 사용: 코드 블록을 구분하는 데 사용되며, 가독성을 높이고 코드 작성을 간결하게 만든다. ISWIM에서 영감을 받은 이 기능은 occam과 Haskell에서도 사용되었으며, 나중에 Python에 의해 널리 사용되었다.[6]
  • 리스트 내포 지원: 간결하고 직관적인 리스트 처리가 가능하다.[6] 특히, `//` 기호를 사용하는 대각화 리스트 내포(diagonalising list comprehensions)를 통해 두 개의 무한 리스트를 결합하여 새로운 리스트를 생성할 수 있다.[7]
  • 커링 지원: 함수를 부분적으로 적용할 수 있다.
  • 모듈 시스템: 코드의 재사용성과 유지보수성을 높인다.

3. 1. 구문

`||` 기호는 한 줄 주석을 나타낸다.[6] 리터럴 스크립트에서는 `>` 기호로 시작하지 않는 모든 줄이 주석으로 간주된다.[6]

미란다는 오프사이드 규칙을 사용하여 코드 블록을 구분한다. 즉, 들여쓰기가 코드 구조를 정의하는 데 중요한 역할을 한다. 이는 ISWIM에서 영감을 받은 기능으로, occam과 Haskell에서도 사용되었으며, 나중에 Python에 의해 널리 사용되었다.

세미콜론(;)은 문장의 끝을 나타내는 데 사용될 수 있지만, 필수는 아니다. 파싱 알고리즘이 레이아웃(들여쓰기)을 지능적으로 사용하기 때문에 괄호 문은 거의 필요하지 않다.

3. 2. 자료형

미란다의 기본 자료형에는 `char`, `num`, `bool`이 있다. 문자열은 `char`의 리스트로 표현된다.[6] `num`은 기본적으로 임의 정밀도 정수(bignums)를 사용하며, 필요에 따라 부동 소수점 값으로 자동 변환된다.[6]

튜플은 잠재적으로 혼합된 유형의 요소 시퀀스로, 괄호로 묶어 표현한다. 예를 들면 다음과 같다.

```haskell

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

```

이는 파스칼과 같은 언어의 레코드와 유사하다.[6]

리스트는 미란다에서 가장 일반적으로 사용되는 자료 구조이다.[6] 대괄호로 묶고 쉼표로 구분된 요소로 작성되며, 모든 요소는 동일한 유형이어야 한다.[6]

```haskell

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

```

리스트 연결은 `++`, 빼기는 `--`, 생성은 `:` , 크기는 `#`, 인덱싱은 `!` 연산자를 사용한다.[6] 예를 들어:

```clean

days = week_days ++ ["Sat","Sun"]

days = "Nil":days

days!0

⇒ "Nil"

days = days -- ["Nil"]

#days

⇒ 7

```

몇 가지 리스트 구축 바로 가기가 있다. `..`는 요소가 산술 수열을 형성하는 리스트에 사용되며, 1이 아닌 증가분을 지정할 수 있다.[6]

```haskell

fac n = product [1..n]

odd_sum = sum [1,3..100]

```

더 일반적이고 강력한 리스트 구축 기능은 "리스트 컴프리헨션"(이전에는 "ZF 표현식"이라고 함)에서 제공되며,[6] 두 가지 주요 형식이 있다. 일련의 항에 적용된 표현식 (예: `squares = [ n * n | n <- [1..] ]` - n의 제곱의 목록, 여기서 n은 모든 양의 정수의 목록에서 가져옴)과 각 항이 이전 항의 함수인 일련의 항 (예: `powers_of_2 = [ n | n <- 1, 2*n .. ]` - 2의 거듭제곱의 리스트)이 있다.[6] 미란다는 무한한 수의 요소가 있는 리스트를 허용하며, 가장 간단한 예는 모든 양의 정수의 목록인 `[1..]`이다.[6]

Haskell에는 없는 기능으로, 미란다는 `//` 기호를 사용하는 diagonalising list comprehensions (대각화 리스트 내포 표기)를 통해 `[1..]`와 같은 무한 리스트 두 개로부터 `[(1, 1), (1, 2), (2, 1), (1, 3), (2, 2), (3, 1), ..]`과 같이 그것들을 합성한 리스트를 만들 수 있다. `[(x, y) // x <- [1..]; y <- [1..]]`와 같이 쓴다.[7]

3. 3. 연산자

미란다의 주요 리스트 연산자는 다음과 같다.[6]

연산자설명예시결과
`++`리스트 연결`week_days ++ ["Sat","Sun"]``week_days`에 `"Sat"`, `"Sun"`을 연결
`--`리스트 차집합`days -- ["Nil"]``days`에서 `"Nil"`을 제거
`:`리스트 생성 (cons)`"Nil":days``days`의 맨 앞에 `"Nil"`을 추가
`#`리스트 크기`#days``days`의 요소 개수를 반환 (7)
`!`리스트 인덱싱`days!0``days`의 첫 번째 요소 (`"Nil"`)를 반환


3. 4. 리스트 내포

리스트 내포를 사용하면 간결하게 리스트를 생성할 수 있다. 예를 들어, 다음은 모든 양의 정수 n에 대해 n의 제곱을 요소로 가지는 무한 리스트를 생성한다.

```haskell

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

```

`[1..]`는 모든 양의 정수의 무한 리스트를 나타낸다.[6]

다음과 같이 함수의 이전 항을 이용하여 정의할 수도 있다.

```haskell

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

```

위의 예시는 2의 거듭제곱을 나타내는 무한 리스트를 생성한다.

또한, `//` 기호를 사용하는 대각화 리스트 내포(diagonalising list comprehensions)를 통해 두 개의 무한 리스트를 결합할 수 있다. 예를 들어, 다음과 같이 두 개의 무한 리스트를 결합하여 새로운 리스트를 생성할 수 있다.

```haskell

[(x, y) // x <- [1..]; y <- [1..]]

```

이는 `[(1, 1), (1, 2), (2, 1), (1, 3), (2, 2), (3, 1), ..]`와 같은 리스트를 생성한다. 일반적인 리스트 내포 표기로는 한쪽 리스트를 무한히 순회하기 때문에 이러한 결과를 얻기 어렵다.[7]

3. 5. 함수

함수 적용은 `sin x`와 같이 함수 이름 뒤에 인수를 나열하는 방식으로 이루어진다.

미란다에서 함수는 일급 함수이므로, 다른 함수에 인자로 전달하거나, 결과로 반환하거나, 자료 구조의 요소로 포함할 수 있다. 또한, 둘 이상의 매개변수가 있는 함수는 커링될 수 있다. 즉, 전체 매개변수 수보다 적은 인수를 제공하여 "부분적으로 매개변수화"된 새로운 함수를 만들 수 있다. 예를 들어:

```haskell

add a b = a + b

increment = add 1

```

위 코드는 인수에 1을 더하는 `increment` 함수를 만드는 방법이다. `add 4 7`은 두 매개변수 함수 `add`를 가져와 `4`에 적용하여 인수에 4를 더하는 단일 매개변수 함수를 얻고, 이를 다시 `7`에 적용하는 것이다.

두 개의 매개변수(피연산자)를 갖는 함수는 `$` 기호를 사용하여 중위 연산자로 바꿀 수 있다. (예: `$add`는 `+` 연산자와 동일). 반대로, 두 매개변수를 취하는 중위 연산자는 함수로 변환할 수 있다.

```haskell

increment = (+) 1

half = (/ 2)

reciprocal = (1 /)

```

`increment`는 인수에 1을 더하는 함수를, `half`는 숫자를 2로 나누는 함수를, `reciprocal`은 역수를 반환하는 함수를 만든다. 인터프리터는 나누기 연산자의 두 매개변수 중 어떤 것이 제공되는지 파악한다.[6]

4. 코드 예시

haskell

subsets [] =

subsets (x:xs) =

where ys = subsets xs

```

```text

> || 모든 소수의 무한 목록, 에라토스테네스의 체로 구함.

가능한 소수 목록은 2부터 시작하는 모든 정수로 시작합니다.

각 소수가 반환되면, 그 소수로 정확히 나눌 수 있는 모든 다음 숫자가 후보 목록에서 필터링됩니다.

> primes = sieve [2..]

> sieve (p:x) = p : sieve [n | n <- x; n mod p ~= 0]

```

```haskell

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
= 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

= 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)

참조

[1] 서적 Functional Programming Languages and Computer Architecture Springer 1985-09
[2] 서적 Proceedings of the third ACM SIGPLAN conference on History of programming languages ACM 2007-06-09
[3] 웹사이트 Open Sourcing Miranda http://codesync.glob[...] 2021-03-22
[4] 웹사이트 Miranda download page https://www.cs.kent.[...] 2021-12-30
[5] 웹사이트 About the name Miranda https://www.cs.kent.[...] 2024-05-18
[6] 문서 ZFは[[公理的集合論#ツェルメロ=フレンケル集合論(ZF公理系)|ツェルメロ・フレンケル]]の意
[7] URL https://www.cs.kent.[...]



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com