If you add NoImplicitPrelude, I think you should also be able to do:

import Prelude hiding (Num)
import qualified Prelude (Num)

instance Num a => Plus a a where
    type PlusResult a a = a
    a + b = a Prelude.+ b




On Tue, Mar 12, 2013 at 2:24 PM, MigMit <miguelimo38@yandex.ru> wrote:
On Mar 13, 2013, at 12:54 AM, "Richard A. O'Keefe" <ok@cs.otago.ac.nz> wrote:
> The interesting challenge here is that we should have
>
>    Date   + Period -> Date      Date   - Period -> Date
>    Period + Date   -> Date      Period - Date   -> ILLEGAL
>    Period + Period -> Deriod    Period - Period -> Period
>    Date   + Date   -> ILLEGAL   Date   - Date   -> Date
>
> and _also_ (remember we are trying to beat C++ here) Int +/- Int -> Int.

Well, an obvious suggestion would be to use MultiParamTypeClasses and TypeFamilies:

{- LANGUAGE MultiParamTypeClasses, TypeFamilies -}
module Date where
import Prelude hiding (Num, (+))
data Date = Date
data Period = Period
class Plus a b where
    type PlusResult a b
    (+) :: a -> b -> PlusResult a b
instance Plus Date Period where
    type PlusResult Date Period = Date
    Date + Period = Date
instance Plus Period Date where
    type PlusResult Period Date = Date
    Period + Date = Date
instance Plus Period Period where
    type PlusResult Period Period = Period
    Period + Period = Period

But I suppose you've been thinking about Haskell98. That, I'm afraid, doesn't seem possible.
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe