2012-11-28 1 views
0

Haskell의 Mod 연산자에 문제가있다. 내가 가진 것을 기반으로 잘못된 유형을 추론한다. Mod는 eval의 맨 아래에 있습니다. 나는 하스켈을 처음 사용하고 수업을 위해 expr을 사용하여 대서양 표준시를 만들고있다. 지금까지 제가 가지고있는 코드는 다음과 같습니다. 나는 그것의 간단한 수정 그러나 위선적 인 말투가 그것을 얻는 것처럼 보인다고 확신한다.추상 구문 트리에서 Mod 사용하기

data Expr = Add Expr Expr 
     | Sub Expr Expr 
     | Mult Expr Expr 
     | EqualTo Expr Expr 
     | GreaterThan Expr Expr 
     | LessThan Expr Expr 
     | Mod Expr 
     | NotEqual Expr Expr 

     | Const Integer 
     | VarName String 
     | TrueE 
     | FalseE 
    deriving (Show,Eq) 


eval :: Expr -> [(String, Integer)] -> Integer 
eval (Add e1 e2) env = eval e1 env + eval e2 env 
eval (Sub e1 e2) env = eval e1 env - eval e2 env 
eval (Mult e1 e2) env = eval e1 env * eval e2 env 
eval (EqualTo e1 e2) env | eval e1 env == eval e2 env = 1 
        | otherwise = 0 
eval (GreaterThan e1 e2) env | eval e1 env > eval e2 env = 1 
      | otherwise = 0  
eval (LessThan e1 e2) env | eval e1 env < eval e2 env = 1 
      | otherwise = 0 
eval (NotEqual e1 e2) env | eval e1 env /= eval e2 env = 1 
         | otherwise = 0 
eval (Mod e1) env = mod eval e1 env 

답변

2

수학 표현식을 나타내는 AST 용 평가기를 작성한다고 가정합니다.

하스켈 함수 mod은 두 개의 인수를 받지만 AST는 하나의 인수 만 받고 평가자의 mod 함수는 세 개의 인수를받습니다. 위의 코드에서이

data Expr = 
    | Mod Expr Expr 

eval :: Expr -> [(String, Integer)] -> Integer 
eval (Mod e1 e2) env = mod (eval e1 env) (eval e2 env) 

같은 기능 eval 데이터 Expr 변경하려고 함수 mod 두 인수 각각 eval e1 enveval e2 env를 수신한다.

0

내가 모드에 대한 잘못된 표기를 사용했다가 모드가 다시 틱으로 둘러싸인한다 ..

eval e1 env `mod` eval e2 env 

바보 같은 실수가 될 것이다.

+1

@AndrewC, 필요 없음 – luqui