Haskell(하스켈) | basic
하스켈 설치 가 다 되었으면 기본적인 문법부터 알아보겠습니다.
연산
산술 연산자
기본적인 연산은 다음과 같습니다.
|
|
여러개의 연산자가 있을 경우에는 연산자 우선순위에 의해서 계산이 됩니다. 또한 괄호를 통해 명시적 우선순위를 표현할 수 있습니다.
|
|
논리 연산자
하스켈의 부울대수의 표현은 대문자로 시작하여야 합니다.
|
|
동치 비교 연산자
|
|
함수 호출
하스켈에서 모든 것은 함수입니다. +
연산자도 함수입니다.
|
|
이렇게 대상 중간에 두는 함수를 중위함수(infix function) 이라고 합니다.
중위함수 외에 주로 사용되는 함수의 호출 방식은 전위함수(prefix function) 입니다. 전위함수는 함수이름 공백 매개변수
의 형태로 호출 됩니다.
|
|
여려개의 매개변수를 받는 함수를 호출하는 방식입니다.
|
|
함수가 연산자 보다 우선 합니다.
|
|
함수 정의
ex.hs 파일을 만들고 다음과 같은 함수를 정의합니다.
|
|
REPL 에서 함수를 정의하고 사용합니다.
ex.hs 에 다음 함수를 추가합니다.
|
|
다시 정의하고 사용합니다.
|
|
다음은 함수내에서 if
를 사용해 보겠습니다. 다음 함수를 추가합니다.
|
|
다음 함수는 24시간 표현의 시간 입력하면 12시 표현으로 바꿔주는 함수입니다.
하스켈에서의 if
는 단독으로 사용할 수 없고 if-then-else
표현의 꼬리 순환(tail recursion)이라고 하는 표현식 입니다.
리스트(list)
리스트는 같은 타입의 묶음입니다. []
로 감싸져 있습니다.
|
|
++
:
를 이용하여 리스트를 연결할 수 있습니다.
|
|
리스트의 한 항목을 조회하려면 !!
를 사용합니다.
|
|
리스트 끼리 비교연산을 할 수 있습니다. 비교할 경우 한목 순서대로 비교하여 값이 같은 항목은 넘어가고 값이 다른 항목이 나오면 비교연산을 수행합니다.
|
|
리스트 안에 같은 타입의 리스트를 항목으로 둘 수 있습니다.
|
|
추가로 리스트에 관련된 함수들이 있습니다.
|
|
레인지(ranges)
하스켈은 반복되는 패턴이 있는 리스트를 간단히 표현할 수 있습니다.
|
|
리스트 +a
리스트에 수학적 표현을 나타낼 수 있습니다. 수학의 집합론 중 조건제시법 과 비슷한데 한가지 예를 들겠습니다.
{ 3 · x|x ∈ N, x ≤ 30 }
위 표현은 ‘30보다 작거나 같은 모든 자연수를 가지고 각각의 값에 3을 곱한 값들의 집합’입니다.
하스켈에서는 다음과 같이 표기 할 수 있습니다.
|
|
조건을 추가할 수 있습니다. 위 리스트에서 ‘50 이하의 원소만 포함’‘ 의 조건은 넣어보면 다음과 같이 ,
이후로 조건을 넣을 수 있습니다.
|
|
20 이하의 홀수와 짝수의 리스트를 구해봅시다.
|
|
짝수의 정수에서 20 이하의 수는 “down”, 20 이상의 수는 “up” 이라고 표현하라는 함수 evenNums
를 정의하면 다음과 같습니다.
|
|
리스트와 리스트의 연산결과로 새로운 리스트를 만들어내는 예제입니다.
|
|
하스켈은 함수의 매개변수에 대응되는 표현을 _
(밑줄)을 사용합니다.
다음은 length 함수를 구현해 놓은 것입니다.
|
|
튜플(tuple)
튜플은 리스트와 비슷합니다만, 여러 타입이 포함될 수 있고 정해진 개수만 가질 수 있습니다.
리스트와 달리 튜플은 ()
를 사용합니다.
|
|
리스트는 크기가 다른 것은 상관 없습니다만, 튜플은 크기가 다른 것은 다른 타입이라고 여겨집니다.
이로 인해서 리스트는 크기가 다른 것은 비교할 수 있지만 튜플은 크기가 다른 것은 비교할 수 없습니다.
(2개의 원소로 이루어진 튜플(pair), 3개의 원소로 이루어진 튜플(triple) 이라고 합니다.)
|
|
페어(pair)를 이용한 유용한 함수들이 있습니다.
|
|
튜플과 리스트로 문제를 하나 풀어보도록 하겠습니다.
피타고라스 정리를 이용하여 직각삼각형 각 변의 크기를 정하는 문제입니다.
조건 : 모든 변의 값은 정수, 모든 변의 값 10 이하, 모든 변의 합은 24
|
|
하스켈 문법의 기본적인 내용을 훓어 봤습니다. 자바를 배울때와는 조금 다른 느낌으로 코딩하는 것은 명확하게 느껴집니다. 한 언어의 패러다임에 귀속되지 않고 다양한 패러다임을 경험할 수 있는 좋은 학습이 될 것 같습니다.