possible OI extension
Simon Peyton-Jones
simonpj at microsoft.com
Fri Jun 27 10:01:00 EDT 2008
Yes, the idea of some kind of backtracking solution of class constraints (multiple instance declarations, choose the one whose context is indeed soluble) has often been suggested, and is quite attractive. But it raises a bunch of new complications. And your proposal does so even more, because it involves a notion of when one context is "stronger" than another. (What exactly does "stronger" mean.)
Just for example, what's the inferred type of
f x = nub (nub [x])
It could be
f :: Eq a => a -> [a]
or f :: Ord a => a -> [a]
So far as the implementation is concerned, "improvement" currently happens by in-place unification, which is hard to undo when you need backtracking, so there's a practical problem there. That'll be ameliorated as we move towards type functions.
So I can see the attraction, but I doubt I'll implement it anytime soon.
Simon
| -----Original Message-----
| From: glasgow-haskell-users-bounces at haskell.org [mailto:glasgow-haskell-
| users-bounces at haskell.org] On Behalf Of Serge D. Mechveliani
| Sent: 27 June 2008 11:56
| To: glasgow-haskell-users at haskell.org
| Subject: possible OI extension
|
| Hello, people,
|
| This is about possible extension in treating of overlapping instances.
| Here is a simple example.
|
| ------------------------------------------
| import qualified Data.Set as Set (empty, member, insert)
| import List (nub)
|
| class Nub a where myNub :: a -> a
|
| instance Eq a => Nub [a] where myNub = nub
|
| instance Ord a => Nub [a]
| where
| myNub xs = nub' Set.empty xs
| where
| nub' _ [] = []
| nub' set (x: xs) = if Set.member x set then nub' set xs
| else x: (nub' (Set.insert x set) xs)
| ------------------------------------------
|
| The idea is that it is good to replace nub of the Haskell-98 library
| with myNub.
| Because:
| for Eq a, myNub costs O(n^2),
| for Ord a, myNub costs O(n*(log n)),
| and it is good to denote this operation with the same name.
|
| Compiling this by GHC under
| -fglasgow-exts -fallow-overlapping-instances
| -fallow-undecidable-instances
|
| yields the error report:
|
| Duplicate instance declarations:
| instance [overlap ok] (Eq a) => Nub [a]
| -- Defined at IOverlap2.hs:8:0-43
| instance [overlap ok] (Ord a) => Nub [a]
| -- Defined at IOverlap2.hs:(9,0)-(15,71)
|
| Probably, as the context of Ord a is stronger than Eq a,
| then on the instance overlap, the compiler could choose the
| instance with the stronger context.
|
| Can there be a reasonably implemented extension of this kind?
|
| Thank you in advance for your comments,
|
| -----------------
| Serge Mechveliani
| mechvel at botik.ru
|
| _______________________________________________
| Glasgow-haskell-users mailing list
| Glasgow-haskell-users at haskell.org
| http://www.haskell.org/mailman/listinfo/glasgow-haskell-users
More information about the Glasgow-haskell-users
mailing list