Steve Downey wrote:
It makes eval1 a bit more complicated, and not as straightforward translation from the type system being described, though.
e.g reducing If looks more like

eval1 (TmIfExpr t1 t2 t3) =
    let t1' = eval1 t1
    in  case t1' of
            { Just t1'' -> Just $ TmIfExpr t1'' t2 t3
            ; Nothing -> Nothing
            }

You should use the fact that Maybe is a monad:

eval1 (TmIfExpr t1 t2 t3) =
  do t1' <- eval1 t1
     return $ TmIfExpr t1' t2 t3

and eval then looks like
eval t =
    let t' = eval1 t
    in case t' of
         { Just t'' -> eval t''
         ; Nothing -> t'
         }

(In the above, I suspect you need Nothing -> t, no prime.)

BTW, there's no need to use let here:

eval t = case eval1 t of Just t' -> eval t'
                         Nothing -> t


_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to