2016-09-17 2 views
3

저는 하스켈과 함께 평가자를 시뮬레이션 중입니다. 그것은 간단해야하지만 디버깅 할 수 없습니다.평가자 시뮬레이트

type State = String -> Int 

extend :: State -> String -> Int -> State 
extend base key val = \x -> if key == x 
           then val 
           else base key 

empty :: State 
empty = \x -> 0 
하십시오 base 환경

I는 룩업 기능 ( String -> Int), 초기 상태 ( empty는 예외 변수 0 평가)로 State 정의 여기

extend 새로운 키를 추가하는 (그리고 그 값이다)

aState = extend empty "A" 5 
bState = extend aState "B" 4 
cState = extend bState "C" 3 

내가 cState 함수에 해당되어야한다고 생각 :

나는 프로그램을 테스트 할 때

\x -> if x == "C" 
      then 3 
      else if x == "B" 
        then 4 
        else if x == "A" 
          then 5 
          else 0 

대신에 cState "B" == 0cState "A" == 0이 표시됩니다.

extend의 문제점을 알 수 없습니까? 누군가 나에게 설명 할 수 있습니까?

답변

6

else 문에서 모든 재귀에서 (x이 아닌)을 검색하면 else base key이됩니다. 그것을 수정 :

extend :: State -> String -> Int -> State 
extend base key val = \x -> if key == x 
           then val 
           else base x 

BTW, 당신이 작성할 수 있습니다

empty :: State 
empty = \_ -> 0 

empty 이후 반환 0에 관계없이 입력합니다.