我只是在学习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
答案 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
是一种类型,您将其用作类型类。类型类是类型的集合,而不是单个类型,例如Integer
和Double
以及Rational
都属于类型类Num
。类型类型显示在=>
左侧,其中真实类型和类型变量显示在=>
的右侧。