Type Families and defaults
Simon Peyton-Jones
simonpj at microsoft.com
Thu Sep 9 05:46:51 EDT 2010
| > I'm afraid I didn't understand your questions well enough to answer them.
|
| My question is, why does this type check:
It's hard for me to answer a question like that! To explain why something type checks I'd have to show every constraint and how it is solved.
I think you have something more specific in mind. Maybe you think "this should not typecheck". E.g. here's an expression (f x), and f has type Int -> <blah, and x has type Boo, so the application should fail to typecheck.
You say that example 1 (which typechecks) is different to example 2 (which does not). Again, in itself that's not surprising. They differ, so their behaviours may differ.
Do remember that (e :: IO n)
means (e :: forall n. IO n)
unless you have ScopedTypeVariables
Sorry not to be more helpful.
Simon
|
| instance Neuron TestNeuron where
| data LiveNeuron TestNeuron = LiveTestNeuron NeuronId
|
| mkLiveNeuron nid = LiveTestNeuron nid
| getNeuronId (LiveTestNeuron nid) = nid
|
| live _ _ = return ()
|
| attach nerve = ((liftM mkLiveNeuron) . forkIO $ bracket (grow :: IO
| FooNeuron) dissolve (live nerve)) :: IO (LiveNeuron TestNeuron)
|
| FooNeuron is obviously different to TestNeuron (but both are instances
| of Neuron class).
|
| Type signature is:
|
| attach nerve = ((liftM mkLiveNeuron) . forkIO $ bracket (grow :: IO n)
| dissolve (live nerve)) :: IO (LiveNeuron n)
|
| This seems different to:
|
| attach nerve = ((liftM mkLiveNeuron) . forkIO $ bracket (grow ::
| forall n. IO n) dissolve (live nerve)) :: IO (LiveNeuron n)
|
| which does not type check.
|
| Maybe I am missing some basic understanding.
|
| > But it'd be worth reading
| http://www.haskell.org/ghc/docs/6.12.2/html/users_guide/other-type-
| extensions.html#scoped-type-variables
|
| I had. Thanks.
|
|
| Mitar
More information about the Glasgow-haskell-users
mailing list