`字符串'适用于太多类型的参数

时间:2012-08-18 13:28:59

标签: haskell

我只是在学习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

2 个答案:

答案 0 :(得分:53)

String是一个类型,而不是类型类,所以你可以(必须)在类型签名中原样使用它。

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

答案 1 :(得分:32)

作为参考,较旧的GHC(即7.2.2或更早版本)过去常常提供更有用的错误:

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

确实这正是您的问题:String是一种类型,您将其用作类型类。类型类是类型的集合,而不是单个类型,例如IntegerDouble以及Rational都属于类型类Num。类型类型显示在=>左侧,其中真实类型和类型变量显示在=>的右侧。