IT story

Haskell의 예외는 어떻게 작동합니까?

hot-time 2020. 9. 14. 21:40
반응형

Haskell의 예외는 어떻게 작동합니까?


GHCi에서 :

Prelude> error (error "")
*** Exception: 
Prelude> (error . error) ""
*** Exception: *** Exception: 

첫 번째 예외가 중첩 된 예외가 아닌 이유는 무엇입니까?


대답은 이것이 부정확 한 예외 의 (다소 놀라운) 의미라는 것입니다.

순수한 코드 가 예외적 인 값 집합 (즉, error또는 IO에서 생성 된 예외 유형이 undefined명시 적으로 아님) 으로 평가되는 것으로 표시 될 수있는 경우 언어는 해당 집합의 모든 값이 반환되도록 허용합니다. Haskell의 예외적 인 값은 명령형 언어의 제어 흐름 기반 예외보다는 부동 소수점 코드 와 비슷 합니다.NaN

고급 Haskeller에게도 가끔씩 문제가 발생하는 경우는 다음과 같습니다.

 case x of
   1 -> error "One"
   _ -> error "Not one"

코드가 일련의 예외로 평가되기 때문에 GHC는 자유롭게 선택할 수 있습니다. 최적화를 사용하면 항상 "하나가 아님"으로 평가됩니다.

우리는 왜 이것을합니까? 그렇지 않으면 언어의 평가 순서를 과도하게 제한 할 수 있습니다. 예를 들어 다음에 대한 결정 론적 결과를 수정해야합니다.

 f (error "a") (error "b")

예를 들어 오류 값이있는 경우 왼쪽에서 오른쪽으로 평가해야합니다. 매우 해스켈 리!

을 지원하기 위해 코드에서 수행 할 수있는 최적화를 무력화하고 싶지 않기 때문에 error해결책은 결과가 예외적 값 집합에서 비 결정적 선택 인 부정확 한 예외임을 지정하는 것입니다. 어떤 방식 으로든 모든 예외가 반환되고 하나가 선택됩니다.

일반적으로 예외는 예외입니다. 예외는 예외입니다. 예외 내부의 문자열에 신경 쓰지 않는 한 일반적으로 error디버그에 사용 하는 것이 매우 혼란 스럽습니다.


참조 : 부정확 한 예외에 대한 의미론 , Simon Peyton Jones, Alastair Reid, Tony Hoare, Simon Marlow, Fergus Henderson. Proc Programming Languages ​​Design and Implementation (PLDI'99), Atlanta. ( PDF )

참고 URL : https://stackoverflow.com/questions/11070690/how-do-exceptions-in-haskell-work

반응형