> class Indexable idx a | idx -> a where
>     first :: idx -> a
>
> This just means that *a* is fully determined by idx (your tuple).

Cutting in to say thanks -- I've had a vague notion of what fundeps do but this really gelled it for me!