summaryrefslogtreecommitdiff
path: root/testsuite/tests/typecheck/should_fail/T17139.hs
blob: 4869e9559df4eae7367730fa877fd82dc4fe99d5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
{-# LANGUAGE GADTs #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE AllowAmbiguousTypes #-}

module T17139 where

import T17139a

type family TypeFam f fun where
  TypeFam f (a -> b) = f a -> TypeFam f b

lift :: (a -> b) -> TypeFam f (a -> b)
lift f = \x -> _ (f <*> x)


{-
x              :: alpha
body of lambda :: beta

[W] TypeFam f (a->b) ~ (alpha -> beta)
-->
[W] (f a -> TypeFam f b) ~ (alpha -> beta)
-->
 alpha := f a
 beta  := TypeFam f b

(<*>) :: Applicative g => g (p -> q) -> g p -> g q

f <*> x

arg1
  (a->b) ~ g0 (p0->q0)
  g0 := ((->) a)
  (p0 -> q0) ~ b   <---------
arg2
  alpha ~ g0 p0
  g0 ~ f          <----------
  p0 := a
res
  g0 q0

Finish with
 [W] f ~ (->) a
 [W] b ~ (a -> q0)
 --> rewrite b
 [W] (a -> q0) ~ a -> (

_ :: g0 q0 -> beta
  :: (a -> q0) -> TypeFam f b
  :: (a -> q0) -> TypeFam ((->) a) (a -> q0)
  :: (a -> q0) -> (a->a) -> TypeFam (-> a) q0

BUT we would get different error messages if we did
   g0 := f
and then encountered [W] g0 ~ ((->) a)
-}