2014-11-06 2 views
1

두 가지 약속은 언제 컴퓨터 과학에서 동일하다고 간주됩니까? 유형이 동일하거나 내용이 다를 때?CS : 함수형 프로그래밍에서의 약속의 동일성

struct { 
    case Value(@autoclosure() -> ValueType) 
    case Error(@autoclosure() -> ErrorType) 
    case None 
} 

과 동등 기능 :

func == <ValueType, ErrorType> (left: Promise<ValueType, ErrorType>, right: Promise<ValueType, ErrorType>) -> Bool 
{ 
    switch (left, right) 
    { 
    case (.Value, .Value): fallthrough 
    case (.Error,.Error): fallthrough 
    case (.Nil, .Nil): 
     return true 
    default: 
     return false 
    } 
} 

나이 :

func == <ValueType, ErrorType> (left: Promise<ValueType, ErrorType>, right: Promise<ValueType, ErrorType>) -> Bool 
{ 
    switch (left, right) 
    { 
    case (.Value, .Value): 
     return left.value() == right.value() 
    case (.Error,.Error): 
     return left.error() == right.error() 
    case (.Nil, .Nil): 
     return true 
    default: 
     return false 
    } 
} 

하나

는보다 구체적인 예를 들어, 나는 신속이 같은 구조체가 올바른 방법입니까 아니면 응용 프로그램에 의존합니까?

+0

나는 약속의 실패 경로가 신속하게 끝이 났음을 깨닫게되었다. 대신에 항상 .Value를 사용하고 열거 형을 통해 더 나은 반환 값을 사용한다. –

+0

하지만 가능한 모든 결과 유형에 오류 또는 실패 상태를 추가해야합니까? generics를 사용하면 이것을 결과에 숨기거나 열거 형을 약속하고 사용 여부에 관계없이 선택할 수 있습니다. – user965972

+0

그래,하지만 반환 값은 다르기 때문에 스위치/케이스에 명시 적 열거가 필요하기 때문에 "성공/실패"를 반환하는 대신 "성공, CouldNotMakeRequest, FileNotFake, ServerError"등을 반환 할 수 있습니다.실패한 것, 실패한 것, 그리고 문자열에서 숨겨진 것을 숨길뿐만 아니라 _whhy_와 _why_를 알게됩니다. –

답변

1

평등에 대한 아름다운 부분은 자신이 의미하는 바를 정의하게된다는 것입니다. 간단한 참조 평등 객체 형식의 객체 유형을 원하면 === 연산자를 사용할 수 있습니다. 자신이 약속 한 것 이상의 참조 평등을 원한다면 동일하게 적용됩니다. 또는 약속을 재구성하고 좀 더 의미를 부여하려는 경우 훨씬 더 흥미로운 방식으로 평등을 정의 할 수 있습니다. 예를 들어, 실행 중이거나 실행이 끝나면 주어진 pthread에 항상 바인드되고 실행되지 않은 경우에는 아무 것도 출력되지 않도록 Future<T>을 작성했습니다. 이렇게하면 pthread_create()에서 두 번 같은 주소를 얻지 못할 가능성이 있기 때문에 평등이 실행중인 각 Future의 스레드 ID를 확인하게됩니다. 각 Promise를 고유 식별자로 바인딩하고 특정 스레드와의 관계를 깨고 동일한 UUID로 동등성을 정의 할 수 있습니다. 또는 평등은 기능 확장성에 대한 약간의 변태 일 수 있습니다. 동일한 약속에 대해 동일한 형식으로 평가 한 경우 두 약속이 동일 할 수 있습니다. 하늘의 한계가 여기 있습니다.

2

대부분의 언어에서 약속의 평등을위한 "표준"이 없습니다. 일반적으로 대부분의 시간을 비교하는 것은 거의 의미가 없습니다. 당신이 겪는 몇 가지 일들이 있습니다.

약속은 시간상 특이 값입니다. 즉, 사용 가능한 값이거나 사용 가능하지 않은 값입니다. Swift에서의 약속 간의 평등성에 대해 논의하는 것은 다소 임의적입니다. promise1 == promise2에서 얻은 것으로 볼 수있는 것이 없으며 이미 참조 평등을 위해 ===을 보유하고 있습니다.

나는 약속에 대해 == 연산자를 정의하지 않을 것입니다. 당신은 평등의 개념을 원하는 경우에 당신이 시간 평등 검사를 고려해야한다 - 즉 :

및 경우에만이 약속은 결국 동일 경우는 true로 평가
func willEqual(p1: Promise<ValueType, ErrorType>, 
       p2: Promise<ValueType, ErrorType>) -> Promise<ValueType, ErrorType> { 
    return p1.then { (val) in p2.then { (val2) in val == val2 }} 
} 

.

우리가 말했듯이 ==과 같은 값을 정의 할 수 없다. 아직 없습니다.

+0

아 글쎄, 나는 (지금까지) 즉각적인 성공 또는 실패와 연쇄 기능을 나타내는 데 사용 해왔다. 아마도 약속의 용어를 사용하는 것이 완전히 적절하지 않을 수 있습니다. – user965972

+0

즉각적인 경우 (성공 또는 실패) 약속을 사용하면 안됩니다. :) –