Determining if an instance is provided by the environment

Hello all, Suppose I have a ClsInst from typechecking the following instance declaration: instance Show [Char] -- i.e. String I'd now like to answer the question: "Is this instance 'provided' by the instance environment?" For example, this instance is provided given that I have these two instances in the environment: instance Show a => Show [a] -- (1) instance Show Char -- (2) However, if I have just instance (1) in the environment, it's not provided (and if you tried to use show "foo", you'd get the error that Char is not an instance of Show.) Is there are convenient way to do this from TcM? With 'tcMatchTys' and I can easily test if there is some instance in the environment which *matches* my instance head (e.g., Show [a] matches Show [Char]) but this doesn't tell me if all the resulting constraints are solvable. Thanks, Edward

You probably want a variant on TcDeriv.simplifyDeriv, shorn of its complex error reporting.
Simon
| -----Original Message-----
| From: ghc-devs [mailto:ghc-devs-bounces@haskell.org] On Behalf Of
| Edward Z. Yang
| Sent: 06 May 2016 00:21
| To: ghc-devs

Thanks Simon, that has all the ingredients I need. I wrote some more docs for the function: https://phabricator.haskell.org/D2180 Edward Excerpts from Simon Peyton Jones's message of 2016-05-06 02:05:31 -0700:
You probably want a variant on TcDeriv.simplifyDeriv, shorn of its complex error reporting.
Simon
| -----Original Message----- | From: ghc-devs [mailto:ghc-devs-bounces@haskell.org] On Behalf Of | Edward Z. Yang | Sent: 06 May 2016 00:21 | To: ghc-devs
| Subject: Determining if an instance is provided by the environment | | Hello all, | | Suppose I have a ClsInst from typechecking the following instance | declaration: | | instance Show [Char] -- i.e. String | | I'd now like to answer the question: "Is this instance 'provided' | by the instance environment?" For example, this instance is provided | given that I have these two instances in the environment: | | instance Show a => Show [a] -- (1) | instance Show Char -- (2) | | However, if I have just instance (1) in the environment, it's not | provided (and if you tried to use show "foo", you'd get the error that | Char is not an instance of Show.) | | Is there are convenient way to do this from TcM? With 'tcMatchTys' | and I can easily test if there is some instance in the environment | which *matches* my instance head (e.g., Show [a] matches Show [Char]) | but this doesn't tell me if all the resulting constraints are solvable. | | Thanks, | Edward | _______________________________________________ | ghc-devs mailing list | ghc-devs@haskell.org | https://na01.safelinks.protection.outlook.com/?url=http%3a%2f%2fmail.ha | skell.org%2fcgi-bin%2fmailman%2flistinfo%2fghc- | devs&data=01%7c01%7csimonpj%40064d.mgd.microsoft.com%7c8c304d9b355244c6 | ee7208d3753be740%7c72f988bf86f141af91ab2d7cd011db47%7c1&sdata=iWdrnb6hC | 8pexyVkWNG22G%2fgdO10tCBy8nuCxhnO0M8%3d

Is there a way to connect this to template-haskell or haskell-src-exts code?
On Fri, May 6, 2016 at 4:40 PM, Edward Z. Yang
Thanks Simon, that has all the ingredients I need.
I wrote some more docs for the function: https://phabricator.haskell.org/D2180
Edward
Excerpts from Simon Peyton Jones's message of 2016-05-06 02:05:31 -0700:
You probably want a variant on TcDeriv.simplifyDeriv, shorn of its complex error reporting.
Simon
| -----Original Message----- | From: ghc-devs [mailto:ghc-devs-bounces@haskell.org] On Behalf Of | Edward Z. Yang | Sent: 06 May 2016 00:21 | To: ghc-devs
| Subject: Determining if an instance is provided by the environment | | Hello all, | | Suppose I have a ClsInst from typechecking the following instance | declaration: | | instance Show [Char] -- i.e. String | | I'd now like to answer the question: "Is this instance 'provided' | by the instance environment?" For example, this instance is provided | given that I have these two instances in the environment: | | instance Show a => Show [a] -- (1) | instance Show Char -- (2) | | However, if I have just instance (1) in the environment, it's not | provided (and if you tried to use show "foo", you'd get the error that | Char is not an instance of Show.) | | Is there are convenient way to do this from TcM? With 'tcMatchTys' | and I can easily test if there is some instance in the environment | which *matches* my instance head (e.g., Show [a] matches Show [Char]) | but this doesn't tell me if all the resulting constraints are solvable. | | Thanks, | Edward | _______________________________________________ | ghc-devs mailing list | ghc-devs@haskell.org | https://na01.safelinks.protection.outlook.com/?url=http%3a%2f%2fmail.ha | skell.org%2fcgi-bin%2fmailman%2flistinfo%2fghc- | devs&data=01%7c01%7csimonpj%40064d.mgd.microsoft.com %7c8c304d9b355244c6 | ee7208d3753be740%7c72f988bf86f141af91ab2d7cd011db47%7c1&sdata=iWdrnb6hC | 8pexyVkWNG22G%2fgdO10tCBy8nuCxhnO0M8%3d
ghc-devs mailing list ghc-devs@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs

Well, I have to write the new variant of this function :) Simon, I ran into a minor complication: if my instance is something like: instance Show a => Show [a] I think I need to pass in a 'CtGiven' for 'Show a'. However, I don't know what to pass as the evidence to the 'CtGiven' constraints. My guess is that it doesn't matter? Edward Excerpts from David Fox's message of 2016-05-06 17:06:41 -0700:
Is there a way to connect this to template-haskell or haskell-src-exts code?
On Fri, May 6, 2016 at 4:40 PM, Edward Z. Yang
wrote: Thanks Simon, that has all the ingredients I need.
I wrote some more docs for the function: https://phabricator.haskell.org/D2180
Edward
Excerpts from Simon Peyton Jones's message of 2016-05-06 02:05:31 -0700:
You probably want a variant on TcDeriv.simplifyDeriv, shorn of its complex error reporting.
Simon
| -----Original Message----- | From: ghc-devs [mailto:ghc-devs-bounces@haskell.org] On Behalf Of | Edward Z. Yang | Sent: 06 May 2016 00:21 | To: ghc-devs
| Subject: Determining if an instance is provided by the environment | | Hello all, | | Suppose I have a ClsInst from typechecking the following instance | declaration: | | instance Show [Char] -- i.e. String | | I'd now like to answer the question: "Is this instance 'provided' | by the instance environment?" For example, this instance is provided | given that I have these two instances in the environment: | | instance Show a => Show [a] -- (1) | instance Show Char -- (2) | | However, if I have just instance (1) in the environment, it's not | provided (and if you tried to use show "foo", you'd get the error that | Char is not an instance of Show.) | | Is there are convenient way to do this from TcM? With 'tcMatchTys' | and I can easily test if there is some instance in the environment | which *matches* my instance head (e.g., Show [a] matches Show [Char]) | but this doesn't tell me if all the resulting constraints are solvable. | | Thanks, | Edward | _______________________________________________ | ghc-devs mailing list | ghc-devs@haskell.org | https://na01.safelinks.protection.outlook.com/?url=http%3a%2f%2fmail.ha | skell.org%2fcgi-bin%2fmailman%2flistinfo%2fghc- | devs&data=01%7c01%7csimonpj%40064d.mgd.microsoft.com %7c8c304d9b355244c6 | ee7208d3753be740%7c72f988bf86f141af91ab2d7cd011db47%7c1&sdata=iWdrnb6hC | 8pexyVkWNG22G%2fgdO10tCBy8nuCxhnO0M8%3d
ghc-devs mailing list ghc-devs@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs

| I think I need to pass in a 'CtGiven' for 'Show a'. However, I don't
| know what to pass as the evidence to the 'CtGiven'
| constraints. My guess is that it doesn't matter?
Correct, since you just want a yes/no answer. Just make up some fresh Ids with newEvVar.
Simon
| -----Original Message-----
| From: Edward Z. Yang [mailto:ezyang@mit.edu]
| Sent: 07 May 2016 01:34
| To: David Fox
participants (3)
-
David Fox
-
Edward Z. Yang
-
Simon Peyton Jones