[Haskell-cafe] Defining types (newbie)

John Fouhy john at fouhy.net
Wed Mar 14 01:27:27 EDT 2007


On 14/03/07, Bryan O'Sullivan <bos at serpentine.com> wrote:
> This wants to be a bit more concrete:
>
> data ThingCompare = TC (a -> a -> Bool) (Thing -> a)
>
> so that you could then have something to execute your comparison thingy:
>
> runTC :: ThingCompare -> Thing -> Thing -> Bool
> runTC (TC compare extract) a b = compare (extract a) (extract b)

...ok, I'm stuck again.  I'm still paralleling "How to write a
financial contract", so I'd now like to combine ThingCompare.

This is my code:
-----------
data Thing = Thing { field_one :: String, field_two :: String,
field_three :: Integer }

t1 :: Thing
t1 = Thing { field_one = "foo", field_two = "bar", field_three = 17 }

t2 :: Thing
t2 = Thing { field_one = "foo", field_two = "baz", field_three = 13 }

type BooleanOp a = a -> a -> Bool
type Field a = Thing -> a

data ThingCompare a = TC (BooleanOp a) (Field a)
                    | And (ThingCompare a) (ThingCompare a)
                    | Or (ThingCompare a) (ThingCompare a)

and :: ThingCompare a -> ThingCompare a -> ThingCompare a
and tc1 tc2 = And tc1 tc2

or :: ThingCompare a -> ThingCompare a -> ThingCompare a
or tc1 tc2 = Or tc1 tc2

runTC :: ThingCompare a -> Thing -> Thing -> Bool
runTC (TC compare extract) x y = compare (extract x) (extract y)
runTC (And tc1 tc2) x y = (runTC tc1 x y) && (runTC tc2 x y)
runTC (Or tc1 tc2) x y = (runTC tc1 x y) || (runTC tc2 x y)

tcEqOne = TC (==) field_one
tcEqTwo = TC (==) field_two
tcGtThree = TC (>) field_three
----------

So I can happily write, for example,

tcEqBoth = and tcEqOne tcEqTwo
runTC tcEqBoth t1 t2

and hugs will tell me "False".

But if I want to combine tcEqOne and tcGtThree I run into type
problems, because one of them uses Strings and the other Integers.  I
want to break the type dependence between the arguments of "And"; can
I do this?  If I type:

data ThingCompare a = TC (BooleanOp a) (Field a)
                    | And (ThingCompare b) (ThingCompare c)
                    | Or (ThingCompare b) (ThingCompare c)

hugs complains that it doesn't know what "b" and "c" are.

-- 
John.


More information about the Haskell-Cafe mailing list