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
59
60
61
62
63
64
|
{-# OPTIONS_GHC -fno-warn-redundant-constraints #-}
{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies,
FlexibleInstances, UndecidableInstances #-}
-- This tests an aspect of functional dependencies, revealing a bug in GHC 6.0.1
-- discovered by Martin Sulzmann
module ShouldCompile where
data PHI = PHI
data EMPT = EMPT
data LAB l a = LAB l a
data Phi = Phi
data A = A
data A_H = A_H [Char]
class LNFyV r1 r2 h1 h2 | r1 -> r2, r1 r2 -> h1 h2 where
lnfyv :: r1->r2->h1->h2
instance ( REtoHT (LAB l c) h)
=> LNFyV (LAB l c) ((LAB l c),EMPT) h (h,[Phi]) where -- (L2)
lnfyv = error "urk"
class REtoHT s t | s->t
instance REtoHT (LAB A [Char]) A_H -- (R4)
foo = lnfyv (LAB A "") ((LAB A ""),EMPT) (A_H "1")
{-
ghci 6.0.1
*Test> :t (lnfyv (LAB A "") ((LAB A ""),EMPT) (A_H "1") )
No instance for (LNFyV (LAB A [Char])
(LAB A [Char], EMPT)
A_H
(h, [Phi]))
arising from use of `lnfyv' at <No locn>
hugs November 2002
Test> :t (lnfyv (LAB A "") ((LAB A ""),EMPT) (A_H "1"))
lnfyv (LAB A "") (LAB A "",EMPT) (A_H "1") :: (A_H,[Phi])
hugs is right, here's why
(lnfyv (LAB A "") ((LAB A ""),EMPT) (A_H "1")) yields
LNFyV (LAB A Char) ((LAB A Char),EMPT) (A_H) c
improve by (L2) LNFyV (LAB A Char) ((LAB A Char),EMPT) (A_H) (A_H,[Phi]), c=(A_H,[Phi])
reduce by (L2) REtoHT (LAB A Char) A_H, c=(A_H,[Phi])
reduce by (R4) c=(A_H,[Phi])
-}
|