“string”应用于太多的types参数

我只是在学习Haskell,我正在编写一个简单的程序来消除String的前n个字符。 这是我得到的:

 cutString :: (Num n, String str) => n -> str -> str cutString n str = case n of 0 -> tail str n -> cutString (n-1) (tail str) 

GHC给了我这个错误,但我不明白为什么:

 `String' is applied to too many type arguments In the type signature for `cutString': cutString :: (Num n, String str) => n -> str -> str 

String是一种types,而不是一个typestypes,所以你可以(必须)只是在types签名中使用它。

 cutString :: Num n => n -> String -> String 

作为参考,以前的GHCs(即7.2.2或更早的版本)曾用来给出这个更有帮助的错误:

 Type constructor `String' used as a class In the type `(Num n, String str) => n -> str -> str' 

事实上,这正是你的问题: String是一种types,你正在使用它作为一个types的类。 types类是types的集合,而不是单一types,例如IntegerDoubleRational是属于typesNum所有types。 types类出现在types的左侧=> ,其中实型和typesvariables出现在=>右侧。