문제

Haskell은 오늘 두통입니다. 예외를 처리하고 싶습니다. 상단에 도달하면 다음과 같이 인쇄합니다.

*** 예외 : ../p/trip/trip.hs :(88,16)-(89,50) : 기능 분할이 아닌 패턴

나에게 그것은 PatternMatchFail 인 것처럼 보이지만 이것은 작동하지 않습니다.

handle (\(PatternMatchFail _) -> return env) f

내 말은, 그것은 컴파일하지만 예외를 처리하지는 않습니다. 내가 뭘 잘못하고 있죠? 이것이 잘못된 예외입니까, 아니면 무엇입니까? 예외를 포착 할 수있는 방법이 있습니까?

도움이 되었습니까?

해결책

오류의 소스를 수정하는 것이 옵션이 아닌 경우 다음을 살펴 봐야합니다.http://www.haskell.org/ghc/docs/latest/html/libraries/base/control-exception.html

"핸들"또는 "시도"또는 "캐치"를 사용하거나 Control의 핵심을 사용한다고 생각합니다. 여기서 핵심은 표준 전주곡의 기능은 순수한 코드의 오류가 아니라 IO-Exceptions 만 처리합니다.

Haskell98에서는 순수한 코드가 예외를 다룰 수 없습니다. 순수한 함수는 값을 반환해야합니다. 예외는 값을 반환하지 못하는 것입니다.

예시:

import qualified Control.Exception as C
x ::String
x = undefined
y = "return value"

main = do C.handle (\_ -> return "caught") (C.evaluate x) >>= print
          C.handle (\_ -> return "caught") (C.evaluate y) >>= print

평가를 요청하는 것은 X와 Y의 평가를 강요하는 것입니다. Haskell은 게으르고 모두가 있습니다.

X의 평가를 나중에 (게으른)까지 연기하게하면, 예외는 나중에 다른 장소에서 발생합니다 (이 경우 값을 사용하는 "인쇄")가 잡히지 않을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top