최근 수정 시각 : 2024-09-20 17:11:41

Haskell/문법


파일:상위 문서 아이콘.svg   상위 문서: Haskell
프로그래밍 언어 문법
{{{#!wiki style="margin: -16px -11px; word-break: keep-all" <colbgcolor=#0095c7><colcolor=#fff,#000> 언어 문법 C( 포인터 · 구조체) · C++( 자료형 · 클래스 · 이름공간 · 상수 표현식 · 특성) · C# · Java · Python · Kotlin · MATLAB · SQL · PHP · JavaScript · Haskell
마크업 문법 HTML · CSS
개념과 용어 함수 · 인라인 함수 · 고차 함수 · 람다식 · 리터럴 · size_t · 상속 · 예외 · 조건문 · 참조에 의한 호출 · eval
기타 == · === · deprecated · NaN · null · undefined · 모나드 · 배커스-나우르 표기법
프로그래밍 언어 예제 · 목록 · 분류 }}}

1. 개요2. 주석3. 함수 만들기4. 타입 적기5. 타입 만들기
5.1. data로 만드는 방법
5.1.1. 값이 하나인 타입5.1.2. 값이 두 개 이상인 타입5.1.3. 여러 타입을 가지고 한 타입 만들기
5.2. type으로 만드는 방법5.3. newtype으로 만드는 방법
6. 타입 클래스
6.1. Eq
7. if

1. 개요

이 문서는 하스켈의 문법을 설명한다.

2. 주석

하스켈에서 -- 오른쪽에 적힌 것은 주석이다.
-- 이 행은 주석이다.
main = putStrLn "Hello World!" -- 코드와 주석을 같은 줄에 적어도 된다.

3. 함수 만들기

두 인자를 서로 더하는 함수 add는 아래와 같이 만든다.
add :: Int -> Int -> Int
add x y = x + y

4. 타입 적기

하스켈에서는 아래와 같이 ::로 타입을 표현한다.
foo :: Int
foo = 42
  • 이름을 적고 ::를 적은 후 타입의 이름을 적는다.
  • 다른 줄에 이름을 적고 =를 적은 후 값을 적는다.
아래처럼 값과 타입을 같은 줄에 적을 수 있다.
foo = 42 :: Int

5. 타입 만들기

5.1. data로 만드는 방법

5.1.1. 값이 하나인 타입

아래는 값이 하나인 타입을 만드는 예제 코드이다.
data Foo = Bar
  • data는 타입을 만들 때 쓰는 키워드이다.
  • Foo는 타입 이름이다.
  • Bar는 값 이름이다.
  • Bar의 타입은 Foo이다.
  • 값과 타입의 이름은 대문자로 시작해야 한다.
이때 아래처럼 값과 타입의 이름이 서로 같아도 된다.
data Foo = Foo

5.1.2. 값이 두 개 이상인 타입

값이 두 개 이상인 타입을 만들 때는 아래와 같이 |로 여러 값을 구분하여 적는다.
data Bool = False | True
타입 Bool의 값은 False이거나 True이다.

아래는 값이 세 가지 경우인 타입의 예시이다.
data Number = One | Two | Three
위와 같이 |로 두 개 이상의 값을 표현한 것을 합(sum) 타입이라고 한다.

값이 너무 많아서 한 줄에 다 적기 어려울 때는 아래처럼 개행하기도 한다.
data Number
  = One
  | Two
  | Three
  | Four
  | Five

5.1.3. 여러 타입을 가지고 한 타입 만들기

이미 존재하는 타입 두 개 이상을 조합해서 새로운 타입을 만드려면 아래처럼 적는다. 예를 들어 사람의 이름과 나이를 표현하는 타입 Person은 아래와 같이 정의할 수 있다.
data Person = Person String Int
이렇게 여러 타입을 조합해서 하나의 타입을 만든 것을 곱(product) 타입이라고 한다.

5.2. type으로 만드는 방법

type은 타입의 별명을 만들 때 쓰는 키워드이다. 예를 들어 문자열 타입 String은 타입 [Char]의 별명이다. 아래처럼 별명을 정의한다.
type String = [Char]

5.3. newtype으로 만드는 방법

6. 타입 클래스

6.1. Eq

class Eq a where
  (==) :: a -> a -> Bool
타입 클래스 Eq의 메서드 ==는 타입이 같은 어떤 임의의 값 두 개를 비교하여 같으면 True를 리턴하고 다르면 False를 리턴한다. 타입 Bool에 해당하는 인스턴스 구현은 아래와 같다.
instance Eq Bool where
  True  == True  = True
  False == False = True
  _              = False

7. if

하스켈에서 if문은 아래와 같이 작성한다.
adult :: Int -> String
adult age = if age >= 18
            then "성인입니다."
            else "미성년자입니다."
  • if를 적고 결과 타입이 Bool인 표현식을 적는다.
  • then을 적고 if에 적은 표현식의 결과가 True인 경우의 결과 값을 적는다.
  • else를 적고 표현식의 결과가 False인 경우의 결과 값을 적는다.

이때 아래 사항을 지켜야 한다.
  • then에 적은 표현식의 타입과 else에 적은 표현식의 타입이 같아야 한다.
  • else와 그 표현식을 생략할 수 없다.