템플릿 하스켈

소개

템플릿 하스켈은 컴파일 중에 자기 자신을 수정하는 프로그램을 작성하기 위한 기능이다. 문법적 제약을 돌아가거나 최적화를 위해 사용한다.

튜플을 리스트로 바꿔야하는 경우를 생각해보자. 하스켈에서 튜플은 원소의 개수에 따라 모두 다른 자료형이기 때문에 하나의 함수로 구현할 수 없고 비슷비슷한 함수들을 반복해서 만들어줘야 한다.

tupleToList2 (x,y) = [x,y]
tupleToList3 (x,y,z) = [x,y,z]
tupleToList4 (x,y,z,w) = [x,y,z,w]

이런 경우에 템플릿 하스켈을 사용하면 컴파일 시점에 각각의 코드를 필요에 따라 만들어주는 단 하나의 함수로 만들 수 있다.

중첩 리스트 풀기

오픈마루에서 대학생 인턴 구인 면접에서 나온 문제라고 합니다.

Quote:

리스트는 유한개의 원소가 정해진 순서로 들어가 있는 자료구조입니다. 리스트에 포함된 원소는 하나의 숫자일수도 있지만 또다른 리스트일수도 있습니다. 이렇게 리스트 속에 리스트가 들어 있는 것을 중첩 리스트(nested list)라고 합시다.

리스트를 격자괄호로 둘러쌓고, 각 원소는 쉼표로 구분해 표기하도록 하죠. 다음은 중첩 리스트의 예입니다.

[HTDP] How to Desing Programs (Felleisen, MIT Press) 팔아욤 ^_^

* How to Design Programs - Felleisen (원서)
-> 40,000

* Digital Systems 9E - Tocci (원서)
-> 15,000

* 인지심리학 - Reed (박권생 번역)
-> 10,000

책 상태는 모두 A급입니다.
단, Digital Systems는 CD는 어디론가 사라졌습니다. -_-;

어린이대공원역(세종대) 역에서 수령해 가시면 됩니다.
아니면 택배비까지 해서 보내주시면 택배로 부쳐드리구요.

연락은 amun83 at gmail dot com 이나 011 - 9582 - 9316 으로 해주시면 됩니다.

안녕하세요~!

함수형 언어에 대해 관심이 많은 사람입니다~!^^

예제 플그램 몇개 해보니...

너무 재미있네요. +ㅁ+

많은 것을 배우고 저두 나눴으면 좋겠습니다.~!

Scheme: 명령형 프로그래밍

스킴은 함수형 프로그래밍 언어지만 다양한 프로그래밍 패러다임을 수용할 수 있다. 여기서는 스킴으로 명령형 프로그래밍을 하는 방법을 알아보자.

set!


프로그래밍에서 시간에 따라 바뀌는 것을 '상태(state)'라고 한다. 명령형 프로그래밍은 상태를 다루는 데 초점을 맞춘다. 다음과 같은 예를 보자.

> (define state 1)
> (define (inc!) (set! state (+ state 1)))
> state
1
> (inc!)
> state
2
> (inc!)
> state
3

set! 함수는 변수의 값을 바꾼다. 처음에 state는 1이었으나 inc! 함수를 한 번 사용할 때마다 값이 1씩 증가한다. set!처럼 변수의 상태를 조작하는 함수의 이름에는 느낌표를 붙이는 것이 관례다.

Scheme in Javascript

스킴 인터프리터를 자바스크립트로 구현해보면 재밌지 않을까 했는 데 이미 누가 한 작업이 있군요. 웹에서 바로 스킴을 써볼 수 있습니다.

jsScheme

파이어폭스에서도 잘 되는 데 just-in-time compilation을 하면 에러가 납니다. 그 이유는 여기에 있으니 혹시 고쳐보실 분은 고쳐보세요.

그 외에 LittleScheme이라는 인터프리터도 있습니다. 자바스크립트로 구현된 것은 아니지만 스킴을 자바스크립트로 바꿔주는 컴파일러도 있군요.

Scheme: 흐름 제어

if

프로그램은 경우에 따라 다른 방식으로 작동해야 할 경우가 있다. 가장 기본은 if다. if는 조건이 참이면 참에 해당하는 경우를, 거짓이면 거짓에 해당하는 경우로 프로그램의 흐름을 달리한다. if의 사용법은 다음과 같다.

(if 조건 참인경우 거짓인경우)

다음은 양수인지 음수인지 판단하는 함수다. 단, 0은 양수로 취급한다.

> (define (양수음수 n) (if (>= n 0) '양수 '음수))
> (양수음수 1)
양수
> (양수음수 -3)
음수

Scheme: 람다 함수와 지역 변수

람다 함수

이제까지 본 함수들은 항상 이름이 있다. 그런데 이름이 없는 함수도 있다. 이를 람다 함수라고 한다. 람다 함수를 정의하는 방법은 아래와 같다. define과 비교할 때 함수 이름이 없다는 점을 제외하면 나머지는 똑같다.

(lambda (인자 목록) (함수 내용) )

람다 함수의 용도에는 몇 가지가 있다. 하나는 이름을 굳이 붙여줄 필요가 없는 일회용 함수를 정의할 때다. 다음의 경우를 보자.

[code]
> (define (inc x) (+ x 1))
> (map inc '(1 2 3))

Scheme: 자료형

참과 거짓

스킴에서 참은 #t, 거짓은 #f로 나타낸다. and, or, not은 각각 논리곱, 논리합, 부정

을 한다.

> (and #t #t)
#t
> (and #t #f)
#f
> (or #f #t)
#t
> (not #t)
#f

참, 거짓을 불 값(boolean)이라고 하는 데 boolean? 함수는 어떤 값이 불 값인지

확인한다.

> (boolean? #t)
#t
> (boolean? 3)
#f

수에는 정수(예: 42), 유리수(예: 3/2), 실수(예:1.5), 복소수(예:2+3i)가 있다. 유리수가

다른 수에 없는 독특한 자료형인데 분수 꼴로 표현한다. 각각 정수인지, 유리수인지

Scheme: 리스트

리스트

스킴의 원형인 리스프(LISP)는 "리스트 처리기(LISt Processor)"의 약자다. 리스트만 처리하는 건 아니지만 그만큼 리스트가 중요한 역할을 한다. 리스트는 여러 개의 값을 늘어놓은 것으로 list 함수로 만든다.

> (list 1 2 3)
(1 2 3)

간단히 괄호 앞에 작은 따옴표를 붙여도 된다.

> '(1 2 3)
(1 2 3)

apply 함수

apply는 리스트에 함수를 적용해주는 함수이다. 예를 들어 (apply + '(1 2 3))은 (+

1 2 3)과 같다.

[code]

내용묶음