[Haskell-cafe] Extending constraints

Bas van Dijk v.dijk.bas at gmail.com
Tue Jun 5 19:52:02 CEST 2012

On 5 June 2012 18:46, Gábor Lehel <illissius at gmail.com> wrote:
> I must be missing something, but this seems a bit useless to me. You
> have a phantom type parameter on Proxy, and then you're hiding it. So
> when you pattern match on ProxyWrapper you recover the fact that there
> was a type which satisfies the constraint, but you don't know what
> type it was, and neither do you know about any values which are of the
> type. What are you trying to do?

I need a list of types that satisfy a certain constraint. I would like
to have the static guarantee that types that don't satisfy the
constraint can't be put in the list, as in:

nums :: [ProxyWrapper Num]
nums = [ ProxyWrapper (Proxy :: Proxy Int)
       , ProxyWrapper (Proxy :: Proxy Double)
       , ProxyWrapper (Proxy :: Proxy String) -- not allowed

fracs :: [ProxyWrapper Fractional]
fracs = [ ProxyWrapper (Proxy :: Proxy Double)
        , ProxyWrapper (Proxy :: Proxy Float)
        , ProxyWrapper (Proxy :: Proxy Int) -- not allowed

> That said, if you want to be able to recover a Typeable constraint, I
> don't see any way except for using 'ProxyWrapper (Ext Typeable
> constraint)' as Andres says or putting 'forall a. (constraint a,
> Typeable a)' in the definition of ProxyWrapper.

Indeed, I'm now going for the latter option.



More information about the Haskell-Cafe mailing list