미란다 (프로그래밍 언어)
"오늘의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. 이름
미란다는 느긋한 계산법을 사용하는 순수 함수형 프로그래밍 언어이다.[6] 즉, 부작용이 없고 명령형 프로그래밍 기능이 없다.[6]
'''미란다'''라는 이름은 라틴어 동사 miror|미로르la의 게룬디브 형태에서 유래되었으며,[5] "존경받다"라는 뜻을 가진다.
로고는 셰익스피어의 희곡 ''템페스트''에 나오는 등장인물 미란다를 존 윌리엄 워터하우스가 묘사한 것이다.
3. 특징
미란다의 주요 특징은 다음과 같다: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