我只是在学习Haskell,并且试图编写一个简单的程序来消除。中的前n个字符String。这就是我得到的:cutString :: (Num n, String str) => n -> str -> strcutString 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
3 回答
森栏
TA贡献1810条经验 获得超5个赞
String 是类型,而不是类型类,因此您(必须)可以在类型签名中按原样使用它。
cutString :: Num n => n -> String -> String
慕桂英546537
TA贡献1848条经验 获得超10个赞
作为参考,较旧的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。类型类显示=>在类型的左侧,其中实型和类型变量显示在的右侧=>。
天涯尽头无女友
TA贡献1831条经验 获得超9个赞
该函数当然具有更简单的类型cutString :: Num n => n -> [a] -> [a]。而且,Num在这种情况下没有太大意义,所以也许类型Integral i => i -> [a] -> [a]甚至Int -> [a] -> [a]更好。 – dflemstr 12年 8月18日,13:39
@dflemstr我敢肯定你的
- 3 回答
- 0 关注
- 443 浏览
添加回答
举报
0/150
提交
取消