haskell - GHC uses catch-all instance if constraint is missing? -


i've been experimenting simple implementation of hlists , function hasint returns true if int member of list:

{-# language flexibleinstances #-}  data hnil = hnil   deriving (show, read)  data hcons b = hcons b   deriving (show, read)  class hasint   hasint :: -> bool  instance hasint hnil   hasint _ = false  instance hasint => hasint (hcons as)   hasint (hcons as) =  (isint a) || (hasint as)  class isint   isint :: -> bool  instance isint int   isint _ = true  instance {-# overlappable #-} isint   isint _ = false  3 = 3 :: int  main =   putstrln $ "isint 3 = " ++ show (isint three) -- true   putstrln $ "isint true  = " ++ show (isint true)  -- false   print $ hasint $ hcons 3 $ hcons true hnil    -- false ??? 

this doesn't give expected results. however, seem work if change:

    instance hasint => hasint (hcons as) 

to:

    instance (isint a, hasint as) => hasint (hcons as) 

on other hand, expect ghc complain if use type class function don't include constraint, , don't such indication in case.

clearly has catch-all instance isint a. could not deduce (isint a) arising use of 'isint' error if replace catch-all instance with:

instance isint bool isint _ = false instance isint hnil isint _ = false 

my question is: expected behavior of ghc - silently use catch-all instance if there no explicit type class constraint?

yes, expected behavior. if write

instance foo 

you declaring types instances of foo, , ghc believes you.

this 100% analogous following:

foo :: int -> bool foo x = x > 0 

even though don't have ord int in context, ghc knows there such instance. likewise, in:

bar :: -> b bar x = {- use foo instance x here -} 

even though don't have foo a in context, ghc knows there such instance.


Comments

Popular posts from this blog

node.js - Node js - Trying to send POST request, but it is not loading javascript content -

javascript - Replicate keyboard event with html button -

javascript - Web audio api 5.1 surround example not working in firefox -