summaryrefslogtreecommitdiff
path: root/testsuite/tests/typecheck/should_compile/T3346.hs
blob: 30b49f731d76a61ec42fb77f4fb39ce8e6707878 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{-# LANGUAGE TypeFamilies  #-}

-- #3346

module Foo where

class EP a where
  type Result a
  from :: a -> Result a
  to   :: Result a -> a

-- {-# RULES "rule1"   forall x. to (from x) = x #-}
-- {-# RULES "rule2"   forall x. from (to x) = x #-}

foo :: EP a => a -> a
-- This is typed in a way rather similarly to RULE rule1
foo x = to (from x)

-- 'bar' has an ambiguous type and is rightly rejected
-- bar :: forall a. Result a -> Result a
-- bar x = from (to x :: a)