[Haskell-beginners] small expression evaluator
Petr Novotnik
pnovotnik at googlemail.com
Tue Mar 22 08:56:45 CET 2011
Hello,
on my journey through Haskell I've hit a problem where I don't know any
further and would greatly appreciate your help.
I've got this code so far:
data Value a e = VConst a
| VFunc (e -> a)
evalV :: Value a e -> e -> a
evalV (VConst x) = const x
evalV (VFunc f) = f
liftV :: (a -> a -> t) -> (Value a e) -> (Value a e) -> e -> t
liftV f x y e = (evalV x e) `f` (evalV y e)
(.==.), (./=.) :: (Eq a) => (Value a e) -> (Value a e) -> e -> Bool
(.==.) = liftV (==)
(./=.) = liftV (/=)
(.&&.), (.||.) .... some more operators
This allows me to write client code like this:
data Person = Person {
personName :: String
, personAge :: Int
}
deriving (Show)
exampleExpr :: Bool
exampleExpr = (VConst 99) .==. (VFunc personAge) $ Person "pete" 99
I was wondering, whether it'd be possible to enable defining expression
without the Value data constructors, i.e.
99 .==. personAge $ Person "pete" 99
I've tried using a type class to have a function for lifting different
types into Values.
class ToValue a e | a -> e where
valueLift :: a -> Value a e
then I tried defining an instance for functions:
instance ToValue ((->) Person a) Person where
valueLift f = undefined
in ghci:
> :t valueLift personName
valueLift personName :: Value (Person -> String) Person
and suddenly I realized this will not work because I would need the type
`Value String Person'.
Now, I'm stuck and don't know which path to take in order to come closer
to being able writing "99 .==. personAge" or "personAge .==. 99". Maybe
I'm approaching it in a completely wrong way or it's simply not
possible. Do you have any ideas, hints?
Many thanks in advance for any kind of feedback,
pete.
More information about the Beginners
mailing list