2013-02-06 2 views
1

일반적인 문장을 사용하는 프로그램을 작성하려고 시도 중입니다. 을 평가하고 각 단계가 평가 될 때이를 보여줍니다. 우리가 할당 문의 순서가있는 경우 예를 들어Haskell의 문장 평가자 추적

, , 그것은으로 실행해야합니다

  • 가 할당 문 1

  • 가 표시 평가 결과 1

  • 이 할당 정책을 평가 평가 2

  • 평가 결과보기 2

지금은 최종 결과 만 보여줍니다. 코드는

> evalS_maybe :: Statement -> Store -> Maybe Store 

> evalS_maybe [email protected](While e s1) s = evalS_maybe (If e 
>             (Sequence s1 (While e s1)) 
>              Skip) 
>            s 
> evalS_maybe Skip s    = Just s 
> evalS_maybe (Sequence s1 s2) s = do 
>         sq <-evalS_maybe s1 s 
>         evalS_maybe s2 sq 
> evalS_maybe (Assign x e) s = do 
>         ag <-evalE_maybe e s 
>         return (Map.insert x ag s) 
> evalS_maybe (If e s1 s2) s  = do 
>          b2 <- evalE_maybe e s 
>          case b2 of 
>           BoolVal True -> evalS_maybe s1 s 
>           BoolVal False -> evalS_maybe s2 s 
>           _    -> return s 

편집이다 :

사용되는 데이터 형식의 나머지 부분은 다음과 같습니다

> type Variable = String 

> data Statement = 
>  Assign Variable Expression   
> | If Expression Statement Statement 
> | While Expression Statement   
> | Sequence Statement Statement  
> | Skip         
> deriving (Show) 


> data Expression = 
>  Var Variable       
> | Val Value       
> | Op Bop Expression Expression 
> deriving (Show) 


> data Bop = 
>  Plus  
> | Minus 
> | Times 
> | Divide 
> | Gt  
> | Ge  
> | Lt  
> | Le  
> deriving (Show) 

> data Value = 
>  IntVal Int 
> | BoolVal Bool 
> deriving (Show) 

> type Store = Map Variable Value 

아무도 도와 주실 수 있습니까? 미리 감사드립니다.

+1

우리는 유용한 정보를 제공하기 전에'Statement'와'Store'에 대한 데이터 정의를 보여 주어야합니다. –

+0

@ChrisTaylor, 나는 질문을 편집하여 동일하게 추가하려고했습니다. 좀 도와 줄 수있어? 감사. –

+2

직면 한 특정 문제는 무엇입니까? 왜 이럴 수가 없니? 지금 당장 질문은 "내 프로그램이하지 못하는 무언가가 있습니다. 나를 위해 끝낼 수 있습니까?" StackOverflow에 대해서는 좋은 질문이 아닙니다. 더 자세하게 얘기해 주 시겠어요? 너 뭐 해봤 니? –

답변

1

추적을보고 싶으면 trace에서 Debug.Trace을 사용하여 참조 투명도를 "속여"중간 정보를 출력 할 수 있습니다.

다른 접근법은 Maybe 주위에 WriterT을 감싸고 tell을 사용하여 중간 정보를 방출하는 것입니다. 이것은 실제로 당신이 하스켈에서 검사 할 수있는 몇 가지 가치를 되돌려 줄 것입니다.

평가가 성공한 경우에만 추적을 제공합니다. 으로 항상으로 추적을 되돌리려면 MaybeTWriter 이상으로 감싸십시오.