2.5 함수 타입(Function Type)
2.5 함수 타입(Function Type)
함수 타입은 모노모프(monomorph)와 함께, 보통 Haxe 사용자에게는 잘 드러나지 않지만 어디에나 존재하는 타입이에요. $type(컴파일 중 표현식의 타입을 출력하는 Haxe 특수 식별자)을 사용하면 드러낼 수 있습니다:
class Main {
static public function main() {
// (i : Int, s : String) -> Bool
$type(test);
$type(test(1, "foo")); // Bool
}
static function test(i:Int, s:String):Bool {
return true;
}
}
함수 test의 선언과 첫 $type 표현식의 출력 사이에는 강한 유사성이 있는데, 한 가지 미묘한 차이가 있어요: 함수 반환 타입이 -> 기호 뒤에 나타난다는 것입니다.
두 표기에서 함수 test가 Int 타입 인자 하나와 String 타입 인자 하나를 받고 Bool 값을 반환한다는 것은 분명해요. 두 번째 $type 표현식에서 test(1, "foo") 같은 호출을 하면 Haxe 타입 검사기가 1이 Int에, "foo"가 String에 할당되는지 확인합니다. 호출의 타입은 test가 반환하는 값의 타입, 즉 Bool과 같아요.
함수 타입에서 인자 이름은 선택적이라는 점을 기억하세요. 함수 타입이 다른 함수 타입을 인자나 반환 타입으로 가진다면, 괄호로 올바르게 묶을 수 있어요. 예를 들어 (Int, ((Int) -> Void)) -> Void는 Int 타입 인자 하나와 함수 타입 Int -> Void 인자 하나를 받고 Void를 반환하는 함수를 나타냅니다.
인자를 하나도 받지 않는 함수의 타입은 ()로 인자 목록을 표현합니다:
class Main {
static public function main() {
// () -> Bool
$type(test2);
}
static function test2():Bool {
return true;
}
}
옛 함수 타입 표기 — Haxe 4 이전에는 함수 타입 표기가 다른 함수형 언어들과 더 유사해서, 인자 타입을 구분하는 데
->를(쉼표 대신) 사용했어요. 위test함수는 이 표기에서Int -> String -> Bool로 타입이 정해졌습니다.test2는Void -> Bool로 표기됐어요.
옛 표기는 여전히 지원되지만, 새 코드에서는 위에서 설명한 새 표기를 쓰는 것이 좋아요. 인자 타입과 반환 타입을 더 명확히 구분하기 때문입니다.
참고(새 함수 타입 표기) — 새 함수 타입 표기는 Haxe 4에서 함께 도입된 화살표 함수(arrow functions)의 문법에 기반을 두었어요.
출처: Function Type
본문
함수 타입의 표현
함수 타입은 인자 타입들의 나열과 -> 뒤의 반환 타입으로 표현됩니다. 예를 들어 (i : Int, s : String) -> Bool은 Int와 String을 받아 Bool을 반환하는 함수입니다. $type 특수 식별자로 어떤 표현식의 타입을 컴파일 타임에 확인할 수 있어요.
인자 이름의 선택성
함수 타입에서 인자 이름은 생략할 수 있어요. 함수 타입이 중첩되면 괄호로 묶어 명확하게 표현합니다. 예를 들어 (Int, ((Int) -> Void)) -> Void처럼요.
인자 없는 함수
인자를 받지 않는 함수는 ()로 인자 목록을 나타냅니다. () -> Bool은 인자 없이 Bool을 반환하는 함수죠.
옛 표기와의 비교
Haxe 4 이전에는 Int -> String -> Bool처럼 커링(currying) 형태로 표기했습니다. 이 옛 표기는 여전히 동작하지만, 새 표기가 인자와 반환 타입 구분에 더 명확해 권장됩니다.