module  Main where 
 
-- Integer arithmetic with (+) and (/) 
data  Term =  
    |  Plus Term Term
    |  Div Term Term
 
-- 
-- Basic evaluator 
-- 
 
eval ( N n)  =  n
eval ( Plus t1 t2)  =  eval t1 +      eval t2
eval 
( Div t1 t2
)   =  eval t1 `
div ` eval t2
 
-- 
-- Evaluator that counts the number of operations 
-- 
-- Returns (Ok n) in case of success 
-- Returns (Error "Division by zero") otherwise 
-- 
 
-- Type of computations having access to a counter, which produce an "a" 
type  Counter a 
=  ( Int ->  ( Int ,  a
) )  
returnC ::  a ->  Counter a
 
bindC ::  Counter a ->  ( a ->  Counter b)  ->  Counter b
 
-- "Run" a Counter computation "c", with initial counter state "s0" 
runC 
::  Counter a 
->  Int ->  ( Int ,  a
)  
-- Increment the counter 
inc ::  Counter ( ) 
 
evalWithCount 
::  Term 
->  ( Int ,  Int ) evalWithCount t =  runC ( eval' t) 0 
  where 
    eval'  ::  Term 
->  Counter 
Int     eval' = undefined 
 
-- 
-- Evaluator that catches division by zero 
-- 
 
data Result a = Error String | Ok a deriving Show 
 
returnR :: a -> Result a 
returnR x = undefined 
 
bindR :: Result a -> (a -> Result b) -> Result b 
bindR m f = undefined 
 
-- Raise an exception 
throw :: String -> Result a 
throw s = undefined 
 
evalChecked :: Term -> Result Int 
evalChecked = undefined 
 
main = print (undefined::String) 
 
bW9kdWxlIE1haW4gd2hlcmUKCi0tIEludGVnZXIgYXJpdGhtZXRpYyB3aXRoICgrKSBhbmQgKC8pCmRhdGEgVGVybSA9IAogICAgICBOIEludAogICAgfCBQbHVzIFRlcm0gVGVybQogICAgfCBEaXYgVGVybSBUZXJtCgotLQotLSBCYXNpYyBldmFsdWF0b3IKLS0KCmV2YWwgOjogVGVybSAtPiBJbnQKZXZhbCAoTiBuKSA9IG4KZXZhbCAoUGx1cyB0MSB0MikgPSBldmFsIHQxICsgICAgIGV2YWwgdDIKZXZhbCAoRGl2IHQxIHQyKSAgPSBldmFsIHQxIGBkaXZgIGV2YWwgdDIKCi0tCi0tIEV2YWx1YXRvciB0aGF0IGNvdW50cyB0aGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMKLS0KLS0gUmV0dXJucyAoT2sgbikgaW4gY2FzZSBvZiBzdWNjZXNzCi0tIFJldHVybnMgKEVycm9yICJEaXZpc2lvbiBieSB6ZXJvIikgb3RoZXJ3aXNlCi0tCgotLSBUeXBlIG9mIGNvbXB1dGF0aW9ucyBoYXZpbmcgYWNjZXNzIHRvIGEgY291bnRlciwgd2hpY2ggcHJvZHVjZSBhbiAiYSIKdHlwZSBDb3VudGVyIGEgPSAoSW50IC0+IChJbnQsIGEpKQoKcmV0dXJuQyA6OiBhIC0+IENvdW50ZXIgYQpyZXR1cm5DIHggPSB1bmRlZmluZWQKCmJpbmRDIDo6IENvdW50ZXIgYSAtPiAoYSAtPiBDb3VudGVyIGIpIC0+IENvdW50ZXIgYgpiaW5kQyBtIGYgPSB1bmRlZmluZWQKCi0tICJSdW4iIGEgQ291bnRlciBjb21wdXRhdGlvbiAiYyIsIHdpdGggaW5pdGlhbCBjb3VudGVyIHN0YXRlICJzMCIKcnVuQyA6OiBDb3VudGVyIGEgLT4gSW50IC0+IChJbnQsIGEpCnJ1bkMgczAgYyA9IHVuZGVmaW5lZAoKLS0gSW5jcmVtZW50IHRoZSBjb3VudGVyCmluYyA6OiBDb3VudGVyICgpCmluYyA9IHVuZGVmaW5lZAoKZXZhbFdpdGhDb3VudCA6OiBUZXJtIC0+IChJbnQsIEludCkKZXZhbFdpdGhDb3VudCB0ID0gcnVuQyAoZXZhbCcgdCkgMAogIHdoZXJlCiAgICBldmFsJyA6OiBUZXJtIC0+IENvdW50ZXIgSW50CiAgICBldmFsJyA9IHVuZGVmaW5lZAoKLS0KLS0gRXZhbHVhdG9yIHRoYXQgY2F0Y2hlcyBkaXZpc2lvbiBieSB6ZXJvCi0tCgpkYXRhIFJlc3VsdCBhID0gRXJyb3IgU3RyaW5nIHwgT2sgYSBkZXJpdmluZyBTaG93CgpyZXR1cm5SIDo6IGEgLT4gUmVzdWx0IGEKcmV0dXJuUiB4ID0gdW5kZWZpbmVkCgpiaW5kUiA6OiBSZXN1bHQgYSAtPiAoYSAtPiBSZXN1bHQgYikgLT4gUmVzdWx0IGIKYmluZFIgbSBmID0gdW5kZWZpbmVkCgotLSBSYWlzZSBhbiBleGNlcHRpb24KdGhyb3cgOjogU3RyaW5nIC0+IFJlc3VsdCBhCnRocm93IHMgPSB1bmRlZmluZWQKCmV2YWxDaGVja2VkIDo6IFRlcm0gLT4gUmVzdWx0IEludApldmFsQ2hlY2tlZCA9IHVuZGVmaW5lZAoKbWFpbiA9IHByaW50ICh1bmRlZmluZWQ6OlN0cmluZykK