[Haskell-cafe] GADT/Typeable/existential behaviour that I don't understand

Tom Ellis tom-lists-haskell-cafe-2017 at jaguarpaw.co.uk
Mon Jul 20 18:18:11 UTC 2020


I can define the following

    import Data.Typeable
    data Foo where Foo :: Typeable x => x -> Foo
    eq = (\a b -> eqT) :: (Typeable a, Typeable b) => a -> b -> Maybe (a :~: b)

and then these expressions work as expected


> case Foo "Hello" of Foo x1 -> case eq x1 "" of { Nothing -> "It was not a string"; Just Refl -> "It was a string" }

"It was a string"

> case Foo 1 of Foo x1 -> case eq x1 "" of { Nothing -> "It was not a string"; Just Refl -> "It was a string" }
"It was not a string"


But if I omit the 'Nothing' branch (as below) I get "Couldn't match
expected type ‘p’ with actual type ‘[Char]’ ‘p’ is untouchable".

Can anyone explain why this happens?


> case Foo "Hello" of Foo x1 -> case eq x1 "" of { Just Refl -> "It was not a string" }
> case Foo 1       of Foo x1 -> case eq x1 "" of { Just Refl -> "It was not a string" }


More information about the Haskell-Cafe mailing list