data Gnu : Type where [noHints, uniqueSearch] ||| Use Bool stop proof search from using constructors G : Bool -> Gnu N : Bool -> Gnu U : Bool -> Gnu||| Makes interaction a bit nicerShow Gnu where show (G _) = "G" show (N _) = "N" show (U _) = "U"FooG : GnuFooG = G TrueFooN : GnuFooN = N TrueFooU : GnuFooU = U True||| Curried versionsCooG : Unit -> GnuCooG _ = FooGCooN : Unit -> GnuCooN _ = FooN CooU : Unit -> GnuCooU _ = FooU||| We'll use this to see what proof Idris finds.Guess : {auto gnu : Gnu} -> StringGuess {gnu} = show gnu||| Calls `Guess {gnu = gnu}` as expectedTestOK1 : (gnu : Gnu) -> StringTestOK1 gnu = Guess||| Calls `Guess {gnu = f ()}` as expectedTestOK2 : (f : Unit -> Gnu) -> StringTestOK2 f = Guess||| This is the meat. I'd expect this function to raise an error||| because it is ambiguous which local/local function to use.TestSurprise1 : (gnu1, gnu2 : Gnu) -> StringTestSurprise1 gnu1 gnu2 = GuessTestSurprise2 : (f,g : Unit -> Gnu) -> StringTestSurprise2 f g = GuessTestSurprise3 : (Unit -> Gnu, Unit -> Gnu) -> StringTestSurprise3 f = Guess
data Gnu : Type where [noHints, uniqueSearch]
||| Use Bool stop proof search from using constructors
G : Bool -> Gnu
N : Bool -> Gnu
U : Bool -> Gnu
||| Makes interaction a bit nicer
Show Gnu where
show (G _) = "G"
show (N _) = "N"
show (U _) = "U"
FooG : Gnu
FooG = G True
FooN : Gnu
FooN = N True
FooU : Gnu
FooU = U True
||| Curried versions
CooG : Unit -> Gnu
CooG _ = FooG
CooN : Unit -> Gnu
CooN _ = FooN
CooU : Unit -> Gnu
CooU _ = FooU
||| We'll use this to see what proof Idris finds.
Guess : {auto gnu : Gnu} -> String
Guess {gnu} = show gnu
||| Calls `Guess {gnu = gnu}` as expected
TestOK1 : (gnu : Gnu) -> String
TestOK1 gnu = Guess
||| Calls `Guess {gnu = f ()}` as expected
TestOK2 : (f : Unit -> Gnu) -> String
TestOK2 f = Guess
||| This is the meat. I'd expect this function to raise an error
||| because it is ambiguous which local/local function to use.
TestSurprise1 : (gnu1, gnu2 : Gnu) -> String
TestSurprise1 gnu1 gnu2 = Guess
TestSurprise2 : (f,g : Unit -> Gnu) -> String
TestSurprise2 f g = Guess
TestSurprise3 : (Unit -> Gnu, Unit -> Gnu) -> String
TestSurprise3 f = Guess