{-# LANGUAGE DefaultSignatures #-}
class C a where
f :: [a]
default f :: (Num a) => [a]
f = [1,2,3,4,5]
The above works, the below doesn't. It seems DefaultSignatures
extension only allows specifying constraints, but not substituting a concrete type. Section Default Method Signatures of the GHC Users Guide doesn't explain this. Why doesn't DefaultSignatures
allow me to substitute a concrete type? What is the rationale? Where can I read more on how and why DefaultSignatures
are implemented?
{-# LANGUAGE DefaultSignatures #-}
class C a where
f :: [a]
default f :: [Int]
f = [1,2,3,4,5]
If you're using GHC 8.0.2 then you should write it in different way because there was type checker regression for those kinds of types. See notes:
https://downloads.haskell.org/~ghc/8.0.2/docs/html/users_guide/8.0.2-notes.html
So you need to write it like this:
{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE TypeFamilies #-}
class C a where
f :: [a]
default f :: (a ~ Int) => [a]
f = [1,2,3,4,5]
Instead of saying that f
has type of list of Int
s, you need to say, that f
has type of lists of some type a
where a
is Int
. {-# LANGUAGE TypeFamilies #-}
language extension is needed to enable type equalities. It's not what it's used for but it is required. Compiles for GHC 8.0.2
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With