Re: [GHC] #13946: 自動選擇實例
GHC
ghc-devs at haskell.org
Sun Jul 9 16:05:20 UTC 2017
#13946: 自動選擇實例
-------------------------------------+-------------------------------------
Reporter: zaoqi | Owner: (none)
Type: feature request | Status: closed
Priority: normal | Milestone:
Component: Compiler | Version: 8.0.2
Resolution: invalid | Keywords:
Operating System: Unknown/Multiple | Architecture:
| Unknown/Multiple
Type of failure: None/Unknown | Test Case:
Blocked By: | Blocking:
Related Tickets: | Differential Rev(s):
Wiki Page: |
-------------------------------------+-------------------------------------
Changes (by RyanGlScott):
* status: new => closed
* resolution: => invalid
Comment:
This is behaving as expected. The issue is that when you type `(b
undefined) :: Char`, GHC attempts to look for a `B a Char` instance. But
`a` is underdetermined, so GHC cannot successfully find an instance.
What you //can// do is use `FunctionalDependencies` to inform GHC that `b`
uniquely determines `a`. That is, you can do this:
{{{#!hs
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE MultiParamTypeClasses #-}
class B a b | b -> a where
b :: a -> b
instance B Int Char where
b = error "B Int Char"
instance B Int () where
b = error "B Int ()"
}}}
Note the use of `| b -> a` in the class declaration for `B`. This is the
notation used to express that `b` uniquely determines `a`. Now, if you try
this:
{{{#!hs
> :t (b undefined) :: Char
(b undefined) :: Char :: Char
}}}
It works, since when GHC tries to find a `B a Char` instance, it knows
that `Char` uniquely determines what `a` should be (in this case, `Int`),
so it finds the `B Int Char` and proceeds.
I'm going to close this as invalid - please reopen if this didn't answer
your question in a satisfactory way.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/13946#comment:2>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list