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
'IT story' 카테고리의 다른 글
ASCII 코드는 7 비트입니까, 8 비트입니까? (0) | 2020.09.14 |
---|---|
Android Room에서 엔티티의 특정 필드 업데이트 (0) | 2020.09.14 |
벡터의 대안 (0) | 2020.09.14 |
git-flow를 따라 이전 릴리스의 핫픽스를 어떻게 처리해야합니까? (0) | 2020.09.14 |
래퍼 클래스 및 기본 유형을 사용하는 경우 (0) | 2020.09.14 |