2015-01-08 2 views
0
내가 (M.lookup의 X 컨텍스트가) 아무것도없는 경우 오류가 발생하는 것을 시도하고

하스켈 오류 처리 문제

expand :: Expression -> [String] -> Context -> Expression 

expand expr [] context = expr 

expand expr (x:xs) context = expand (subst x newExp expr) xs context 
    where 
     (Just newExp) = (M.lookup x context) 

이 코드 조각은 그렇게 할 수가 있어요

?

감사합니다.

expand expr [] context = Just expr 
expand expr (x:xs) context = do 
    newExpr <- M.lookup x context 
    expand (subst x newExpr expr) xs context 

이 대신 error를 사용하여 오류를 던지는, 사용하기위한 방법 Maybe, 당신은 단지 값을 반환하고 오류를보고하는 방법에 대한 나중에 결정할 수 있습니다 :

답변

3

그냥 expand 반환 Maybe Expression을 사용자에게 프로그램을 중단하는 대신 성공 또는 실패를 나타낼 수있는 데이터 형식을 사용하는 것이 좋습니다. 당신은 정말, 정말 대신 error를 사용하려면

, 당신은

expand expr [] context = expr 
expand expr (x:xs) context = case M.lookup x context of 
    Nothing -> error $ x ++ " not found in context" 
    Just newExpr -> expand (subst x newExp expr) xs context 

를 작성할 수 그러나 이것은 분명히 관용적 하스켈 아니라고 경고, 그것은 특히 모나드 경우, 적절한 오류 처리를 할 것이 훨씬 더 낫다 Maybe는 매우 쉽습니다.