`String' is applied to too many type arguments
I'm just learning Haskell and I was trying to write a simple program to eliminate the first n characters from a String
. This is what I got:
cutString :: (Num n, String str) => n -> str -> str
cutString n str = case n of
0 -> tail str
n -> cutString (n-1) (tail str)
GHC gives me this error though, and I can't figure out why:
`String' is applied to too many type arguments
In the type signature for `cutString':
cutString :: (Num n, String str) => n -> str -> str
String
is a type, not a typeclass, so you can (must) just use it as-is in the type signature.
cutString :: Num n => n -> String -> String
For reference, older GHCs (i.e. 7.2.2 or earlier) used to give this rather more helpful error:
Type constructor `String' used as a class
In the type `(Num n, String str) => n -> str -> str'
Indeed that is exactly your problem: String
is a type, and you are using it as a type class. A type class is a collection of types, rather than a single type, e.g. Integer
and Double
and Rational
are all types belonging to the type class Num
. Type classes appear to the left of =>
in types, where real types and type variables appear to the right of =>
.