2014-03-26 3 views
31

Kotlin 설명서에서 :단위 반환 함수의 목적은 무엇입니까

함수가 유용한 값을 반환하지 않으면 반환 유형이 Unit입니다. 단위는 단 하나의 값 (Unit.VALUE)이있는 유형입니다. 이 값을 명시 적으로 반환 할 필요는 없습니다.

fun printHello(name : String?) : Unit { 
    if (name != null) 
    print("Hello, $name!") 
    else 
    print("Hi there!") 
    // We don't need to write 'return Unit.VALUE' or 'return', although we could 
} 

함수에서 단위 반환의 목적은 무엇입니까? 거기에 VALUE가있는 이유는 무엇입니까? VALUE은 무엇입니까?

+7

나는 범주 이론 전문가는 아니지만 AFAIK이라는 이름은 '무효'이며 '단위'는 범주 이론에서 비롯된 것입니다. 'void'는 멤버가없는 카테고리이고, unit은 멤버가 하나 인 카테고리이고, bool은 멤버가 두 개인 카테고리입니다 (true와 false). 'void'는 C에서 상속 받았으며 일반적인 코드에 대한 주요 번거 로움입니다. 일반적으로 Java에서는 C#과 C++에서 홀수 타입 (값이 없음)이기 때문에 특별히 'void'케이스를 처리해야합니다. 'unit '은 특수한 경우를위한 필요가 없다는 것을 의미하는 하나의 값을 가지고 있기 때문에 미묘하게 우수합니다. 또한 FP에서는 모든 함수가 1 개의 인수를 취하므로 무의미한 값이 필요합니다. – FuleSnabel

답변

69

목적은 C 또는 Java의 void과 동일합니다. 이 등 일반적인 인수로 전달 될 수 있도록 만 단위는 적절한 유형은, 우리가 "무효"를 호출하지 않는 이유는

  1. : 단어 "무효"는 의미 "아무것도", 또 다른이 있기 때문에 유형이 Nothing 인 경우 "전혀 가치가 없음"을 의미합니다. 즉 계산이 정상적으로 완료되지 않았거나 예외가 발생했습니다. 우리는 의미의 충돌을 감당할 수 없었습니다.

  2. 왜 단위가 값을 가지는지 (즉, Nothing과 같지 않음) : 일반 코드가 원활하게 작동 할 수 있기 때문입니다. 일반 매개 변수 T에 대해 Unit을 전달하면 모든 T에 대해 작성된 코드에는 객체가 있어야하며 Unit의 유일한 값인 객체가 있어야합니다.

  3. 어떻게 단위의 값에 액세스하려면 : 그것은 싱글 톤 객체이기 때문에, 단지 Unit

+1

감사합니다!나는 지금 그것이 무효가 아닌 이유를 봅니다. 그러나 'Unit'을 선택하는 것은 저를 약간 오도하는 것 같습니다. 나는 영어 원어민이 아니지만. – MajesticRa

+13

"단위"는 "하나의 가치 만있는 것"을 나타냅니다. 이는 전통적인 이름으로 기능적 언어에서 유래했습니다. 나는이 이름이 매우 직관적이지는 않지만, 더 나은 이름을 발명하지 못했다는 것에 동의한다. –

+2

'Unit.VALUE'가 더 이상 존재하지 않는 것처럼 보입니다.'Unit' 만 사용하는 것 같아요. –

7

단위 때문에 일반 이유이다 존재하는 주된 이유라고. Kotlin 문서의 예제를 사용합시다.

class Box<T>(t: T) { 
    var value = t 
} 

우리는 코 틀린 클래스의 초기화에 전달 된 형식에서 추론 할 수 있도록 단위 값을 반환하는 이유는

var box = Box(Unit) 

수 있습니다. 물론 명시 적으로 다음과 같이 작성할 수도 있습니다.

var box = Box<Unit>(Unit) 

그러나 모두 동일하게 반환 값을 가져야합니다. 이제 코 틀린 자바에서 무효 키워드는 아무것도 없습니다. Nothing은 Kotlin의 유형 계층 구조에서 마지막이지만 하나 인 유형입니다. 이 없습니까? (Nullable Nothing) 이것은 전혀 값을 반환하지 않습니다. 어떤 값도 반환하지 않기 때문에 위 코드에서이 값을 유형으로 전달할 수 없습니다.

var box = Box(Nothing) //This will return an Error 
관련 문제