On Nov 5, 2015, at 1:12 PM, Jan Bracker <[email protected]> wrote:
> 
> 1. Is there a function in the type system which I can use to evaluate type 
> functions and expand type synonyms (including associated instances)? Ideally 
> I would want something that looks like this 'Type -> TcM Type'. I know that 
> this kind of evaluation is not necessarily possible (e.g. type variables that 
> can't be matched against in a type function application), but it would be 
> helpful if the function could at least evaluate/expand as far as is possible 
> in the current context. That way I don't have to manually lookup type family 
> instances or type synonyms and make mistakes by doing so. This would also 
> ease the support for the different type system extensions available, which I 
> currently have to manually reimplement.

I think FamInstEnv.normaliseType is the function you're looking for. You can 
get the FamInstEnvs argument from tcGetFamInstEnvs.

> 
> 2. If I have an instance and a number of type arguments for that instance, is 
> there an easy way to check if that instance is instantiated by those 
> arguments? Something of the form '[Ct] -> ClsInst -> [Type] -> TcM (Maybe 
> EvTerm)' would be useful. This function would take the given and derived 
> constraints and deliver evidence for the instantiation if it is possible or 
> return nothing if it is not. Again, if there are some open type variables I 
> know this is not always possible in general and I am aware that this, in its 
> full generality, requires a call to the constraint solver. But currently I am 
> manually walking through the instance constraints to check if they are 
> instantiated given the arguments [3] and then I also manually produce 
> evidence [2]. In that process I ignore type equalities, type synonym and type 
> families, because that would require me to implement question 1. I suspect 
> this kind of functionality should exists somewhere within the GHC API. I 
> would want this function to 
 work with type arguments, whose only type variables already occur in the given 
and derived constraints. I think in that case it should always be possible to 
determine if the instance is instantiated.

I'm less familiar with this. Does InstEnv.lookupInstEnv do it for you?

I hope this is helpful!
Richard

_______________________________________________
ghc-devs mailing list
[email protected]
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs

Reply via email to