{- This module defines a Normal cless and a function normal used for forcing evaluation. The idea is originally from Colin and has been modified to do recursive force evaluation. To prevent repeated force, the expression to be forced should be packed with a flag indicating if a force has been done. Functions which support this idea are provided. XZ, 19/2/92 -} module Norm where {- class Normal -} infixr 3 `andAnd` -- partain andAnd a b = if a then if b then True else error "andAnd: 2nd argument not True" else error "andAnd: first argument not True\n" -- end partain data (Normal a) => Norm_able a = Norm_pack Bool a --deriving () class Normal a where normal :: a -> Bool instance (Normal a) => Normal [a] where normal (x:xs) = normal x `andAnd` normal xs normal _ = True instance (Normal a, Normal b) => Normal (a,b) where normal (x,y) = normal x `andAnd` normal y instance (Normal a, Normal b, Normal c) => Normal (a,b,c) where normal (x,y,z) = normal x `andAnd` normal y `andAnd` normal z instance (Normal a, Normal b, Normal c, Normal d, Normal e, Normal f) => Normal (a,b,c,d,e,f) where normal (x,y,z,u,v,w) = normal x `andAnd` normal y `andAnd` normal z `andAnd` normal u `andAnd` normal v `andAnd` normal w {- not in 1.3: instance (Normal a, Normal b) => Normal (Assoc a b) where normal (i:=v) = normal i `andAnd` normal v -} instance Normal Bool where normal True = True normal _ = True instance Normal Int where normal 0 = True normal _ = True instance Normal Float where normal 0 = True normal _ = True instance Normal Double where normal 0 = True normal _ = True {- instance Normal ( a -> b ) where normal _ = True -} pack_obj obj = Norm_pack (normal obj) obj normalize_obj (Norm_pack b _) = b retrieve_obj (Norm_pack _ obj) = obj