[Haskell-cafe] type checking failure curiosity
Brandon Allbery
allbery.b at gmail.com
Sun Nov 14 20:01:44 UTC 2021
At a guess, the problem here is that you need to use
ScopedTypeVariables and `forall` to bring the right `q` into scope.
Otherwise, `q` represents a *new* type variable unrelated to the one
in the type signature for `reachable`, and of course ghc cannot
reconcile that independent type variable with the requirement that it
match the one in the earlier type signature.
On Sun, Nov 14, 2021 at 2:58 PM Julian Bradfield
<jcb+hc at julianbradfield.org> wrote:
>
> In the course of updating a tutorial for this year's course, I found
> the provided code didn't compile. This is because a key value is
> "undefined" in order for the students to fill it in, but I'm curious
> why it can't be typechecked nonetheless.
>
> The code is:
>
> reachable :: (Ord q) => FSM q -> Set(Set(q)) -> Set(Set(q))
> reachable fsm@(FSM qs as ts ss fs) supers =
> let new :: Set(Set(q)) -- typechecking fails without this declaration
> new = undefined
> in if null new then supers else reachable fsm (supers \/ new)
>
> The \/ in the last line is just Set.union.
>
> On the face of it, the last term directly forces "new" to have type
> Set(Set(q)), so why doesn't Haskell see that?
>
> Without the explicit type declaration of "new", we get:
>
> • Could not deduce (Foldable t0) arising from a use of ‘null’
> from the context: Ord q
> bound by the type signature for:
> reachable :: forall q. Ord q => FSM q -> Set (Set q) -> Set (Set q)
> at CLTutorial9.hs:127:1-60
> The type variable ‘t0’ is ambiguous
> These potential instances exist:
> instance Foldable (Either a) -- Defined in ‘Data.Foldable’
> instance Foldable Set -- Defined in ‘Data.Set.Internal’
> instance Foldable Maybe -- Defined in ‘Data.Foldable’
> ...plus two others
> ...plus 27 instances involving out-of-scope types
> (use -fprint-potential-instances to see them all)
> • In the expression: null new
> In the expression:
> if null new then supers else reachable fsm (supers \/ new)
> In the expression:
> let new = undefined
> in if null new then supers else reachable fsm (supers \/ new)
> |
> 130 | in if null new then supers else reachable fsm (supers \/ new)
> | ^^^^^^^^
> _______________________________________________
> Haskell-Cafe mailing list
> To (un)subscribe, modify options or view archives go to:
> http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
> Only members subscribed via the mailman list are allowed to post.
--
brandon s allbery kf8nh
allbery.b at gmail.com
More information about the Haskell-Cafe
mailing list