Skip to content

Instantly share code, notes, and snippets.

@nattybear
Last active December 29, 2020 10:38
Show Gist options
  • Save nattybear/dfa8cf35854e67038d1487ae36e3f036 to your computer and use it in GitHub Desktop.
Save nattybear/dfa8cf35854e67038d1487ae36e3f036 to your computer and use it in GitHub Desktop.
하스켈 타입 변수

반복은 싫어

함수 addInt는 타입이 int인 인자 두개를 받아서 서로 더한 값을 리턴한다.

int addInt(int x, int y)
{
  return x + y;
}

타입이 double인 두 값을 더하려면 함수를 새로 만들어야 한다.

double addDouble(double x, double y)
{
  return x + y;
}

함수 addIntaddDouble은 둘 다 기능이 비슷하지만 타입이 다르기 때문에 함수를 각각 따로 만들어야 한다.

하나의 함수로 둘 다 만족시킬 수는 없을까?

템플릿

C++에서는 템플릿이라는 기능을 이용하면 위 문제를 해결할 수 있다. template

template <typename T>
T add(T x, T y)
{
  return x + y;
}

이렇게 만든 템플릿 함수를 사용하려면 호출할 때 타입 이름을 적어야 한다.

add<int>(1, 2);
add<double>(1.0, 2.0);

타입 변수

하스켈에서 구체적인 타입을 적을 때는 첫글자를 대문자로 적는다. Int Double

addInt :: Int -> Int -> Int
addInt x y = x + y

addDouble :: Double -> Double -> Double
addDouble x y = x + y

반면에 아직 정해지지 않은 모호한 타입을 적을 때는 소문자로 적는다. a

add :: a -> a -> a
add x y = x + y

이렇게 하면 템플릿처럼 여러 타입에 두루 쓸 수 있는 함수를 만들 수 있다.

ghci> add 1 2
3
ghci> add 1.0 2.0
3.0

하스켈에서는 타입 a와 같은 것을 타입 변수라고 한다. type variable

틀린 설명

사실 함수 add의 타입은 아래처럼 적어야 한다.

add :: Num a => a -> a -> a

Num a => 부분은 아직 설명하지 않은 것이다. 타입 제약이라는 것인데 다음 편에 따로 소개한다. type constraints

진짜 쉬운 하스켈

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment