Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

`String' is applied to too many type arguments

Tags:

haskell

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
like image 977
Husker14 Avatar asked Aug 18 '12 13:08

Husker14


2 Answers

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
like image 53
Daniel Wagner Avatar answered Nov 04 '22 23:11

Daniel Wagner


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 =>.

like image 33
Ben Millwood Avatar answered Nov 04 '22 21:11

Ben Millwood