함수 addInt
는 타입이 int
인 인자 두개를 받아서 서로 더한 값을 리턴한다.
int addInt(int x, int y)
{
return x + y;
}
타입이 double
인 두 값을 더하려면 함수를 새로 만들어야 한다.
double addDouble(double x, double y)
{
return x + y;
}
함수 addInt
와 addDouble
은 둘 다 기능이 비슷하지만 타입이 다르기 때문에 함수를 각각 따로 만들어야 한다.
하나의 함수로 둘 다 만족시킬 수는 없을까?
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