함수 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 -> aNum a => 부분은 아직 설명하지 않은 것이다. 타입 제약이라는 것인데 다음 편에 따로 소개한다. type constraints