On Sun, 22 Dec 2013, Dr. ERDI Gergo wrote:

If it's only A and B, perhaps abominations like these could be considered:

    -- implicit foralls
    pattern Show t => P t :: (Num t, Eq b) => b -> T t

    -- explicit foralls
    pattern forall t. Show t => P t :: forall b. (Num t, Eq b) => b -> T t

I'm not 100% sure what that 't' in 'P t' is supposed to be in your example. 'P' is not like a type constructor at all; it's a lot more like a data constructor.

Thinking further about it, I think this could work, using a syntax similar to data constructor definitions instead of sticking to the function type syntax:

pattern (Num a, Eq b) => P a b :: (Show a) => T a

or with explicit foralls (using the fact that we can deduce which tyvars are universial vs existential simply by seeing if they occur in 'T a'):

pattern forall a b. (Num a, Eq b) => P a b :: (Show a) => T a

my only concern with this one is that the direction of the first double arrow doesn't "feel right".

Other examples with this syntax:

-- Number literal patterns
pattern Z :: (Num a, Eq a) => a pattern Z = 0

-- Monomorphic patterns
pattern TrueAnd Bool :: [Bool]
pattern TrueAnd b = [True, b]

-- Infix notation
pattern a :< Seq a :: Seq a
pattern x :< xs <- (Seq.viewl -> x Seq.:< xs)

I'm liking this so far.

Bye,
        Gergo

--

  .--= ULLA! =-----------------.
   \     http://gergo.erdi.hu   \
    `---= ge...@erdi.hu =-------'
RICE: Race Inspired Cosmetic Enhancement
_______________________________________________
Glasgow-haskell-users mailing list
Glasgow-haskell-users@haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

Reply via email to