... | ... | @@ -25,7 +25,7 @@ zag (Succ t) = snd (zig t) |
|
|
As with many operations on non-regular (or nested) types, `zig` and `zag` need to be polymorphic in the element type. In Haskell 98, the bindings of the two functions are interdependent, and thus constitute a single binding group. When type inference is performed on this group, `zig` may be used at different types, because it has a user-supplied polymorphic signature. However, `zag` may not, and the example is rejected, unless we add an explicit type signature for `zag`.
|
|
|
|
|
|
|
|
|
However GHC, Hugs, Nhc98, and jhc follow the suggestion of Mark Jones in [ Typing Haskell in Haskell](http://www.cse.ogi.edu/~mpj/thih/), that the dependency analysis should ignore references to variables that have an explicit type signature. Hence `zag` does not depend on `zig`, and we can infer the type
|
|
|
However GHC, Hugs, Nhc98, and jhc follow the suggestion of Mark Jones that the dependency analysis should ignore references to variables that have an explicit type signature. Hence `zag` does not depend on `zig`, and we can infer the type
|
|
|
|
|
|
```wiki
|
|
|
zag :: BalancedTree a -> a
|
... | ... | @@ -36,3 +36,25 @@ and then go on to successfully check the type signature of `zig`. |
|
|
|
|
|
|
|
|
Dependency groups are smaller, and more programs type-check.
|
|
|
|
|
|
## References
|
|
|
|
|
|
- [ Dependency Analysis](http://haskell.org/onlinereport/decls.html#sect4.5.1) in the Haskell 98 Report
|
|
|
- [ Typing Haskell in Haskell](http://www.cse.ogi.edu/~mpj/thih/), Mark Jones, Haskell Workshop 1999.
|
|
|
|
|
|
## Proposal
|
|
|
|
|
|
|
|
|
Modify the definition of dependency group in the above section to
|
|
|
|
|
|
>
|
|
|
> Two variables bound by value declarations are in the same declaration group if either
|
|
|
|
|
|
>
|
|
|
> 1) they are bound by the same pattern binding, or
|
|
|
|
|
|
>
|
|
|
> 2) their bindings are mutually recursive (perhaps via some other declarations that are also part of the group), *ignoring uses of variables that have an explicit type signature*
|
|
|
|
|
|
|
|
|
The semi-formal rules in the rest of the section would have to go: it would no longer be possible to make binding groups explicit with a source-to-source transformation. |