41

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

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
4

2 回答 2

54

String是一种类型,而不是类型类,因此您可以(必须)在类型签名中按原样使用它。

cutString :: Num n => n -> String -> String
于 2012-08-18T13:30:11.200 回答
33

作为参考,较旧的 GHC(即 7.2.2 或更早版本)曾经给出这个更有用的错误:

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

确实,这正是您的问题:String是一种类型,并且您将其用作类型类。类型类是类型的集合,而不是单个类型,例如IntegerandDoubleRational是属于类型类的所有类型Num。类型类出现=>在类型的左侧,而实际类型和类型变量出现在类型的右侧=>

于 2012-08-18T22:11:13.710 回答